Как извлечь данные из списка с несколькими группами? - PullRequest
0 голосов
/ 19 сентября 2018

Я новичок в R, и у меня есть вопрос об извлечении данных из списка с несколькими группами.Например, у меня есть такой набор данных:

data(iris)

iris$Group = rep(c("High","Low", each=5))
iris = iris[sample(nrow(iris)),]
mylist = list(iris[1:50,], iris[51:100,], iris[101:150,])

head(mylist)[[1]]

    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species Group
51           7.0         3.2          4.7         1.4 versicolor  High
123          7.7         2.8          6.7         2.0  virginica  High
147          6.3         2.5          5.0         1.9  virginica   Low
23           4.6         3.6          1.0         0.2     setosa  High
120          6.0         2.2          5.0         1.5  virginica   Low
141          6.7         3.1          5.6         2.4  virginica  High

В каждом списке я бы хотел сгруппировать по Species и вычислить значение P по t.test из Sepal.Length между Group Высокий и низкий.Например, я хотел бы получить значение P между Group High и Low, равным Species virginica, и т. Д. Для каждого списка.

Я запутался в этом.Может ли кто-нибудь помочь?Спасибо!

1 Ответ

0 голосов
/ 19 сентября 2018

В базе R вы можете сделать следующее

lapply(mylist, function(x)
    with(x, t.test(Sepal.Length[Group == "High"], Sepal.Length[Group == "Low"])$p.value))
#[[1]]
#[1] 0.2751545
#
#[[2]]
#[1] 0.5480918
#
#[[3]]
#[1] 0.864256

или purrr / tidyverse заход

library(tidyverse)
bind_rows(mylist, .id = "id") %>%
    group_by(id) %>%
    nest() %>%
    mutate(pval = map_dbl(data, ~t.test(
        .x$Sepal.Length[.x$Group == "High"],
        .x$Sepal.Length[.x$Group == "Low"])$p.value))
## A tibble: 3 x 3
#  id    data               pval
#  <chr> <list>            <dbl>
#1 1     <tibble [50 × 6]> 0.275
#2 2     <tibble [50 × 6]> 0.548
#3 3     <tibble [50 × 6]> 0.864

Обновление

Квыполнить t-тесты Sepal.Length между Group = "Low" и Group = "High" в пределах Species, которые вы можете выполнить

lapply(mylist, function(x)
    with(x, setNames(sapply(unique(Species), function(y)
        t.test(Sepal.Length[Group == "High" & Species == y], Sepal.Length[Group == "Low" & Species == y])$p.value), unique(Species))))
#[[1]]
#versicolor  virginica     setosa
#0.80669755 0.07765262 0.47224383
#
#[[2]]
#    setosa  virginica versicolor
# 0.6620094  0.2859713  0.2427945
#
#[[3]]
#versicolor     setosa  virginica
# 0.5326379  0.6412661  0.5477179

Имейте в виду, что вам придется корректировать необработанные p-значения для несколькихпроверка гипотез.

Чтобы учесть проверку нескольких гипотез, вы могли бы немного изменить приведенный выше код, чтобы получить

lapply(mylist, function(x)
    with(x, p.adjust(setNames(sapply(unique(Species), function(y)
        t.test(Sepal.Length[Group == "High" & Species == y], Sepal.Length[Group == "Low" & Species == y])$p.value), unique(Species)))))
#[[1]]
#versicolor  virginica     setosa
# 0.9444877  0.2329579  0.9444877
#
#[[2]]
#    setosa  virginica versicolor
# 0.7283836  0.7283836  0.7283836
#
#[[3]]
#versicolor     setosa  virginica
#         1          1          1

Здесь мы используем p.adjust с коррекцией Холма по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...