如何从具有多个组的列表中提取数据?

时间:2018-09-19 00:47:09

标签: r list

我是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分组,并按t.test高和低之间的Sepal.Length的{​​{1}}计算P值。例如,我想要获得Group弗吉尼亚州的Group高和低之间的P值,以此类推。对于每个列表,依此类推。

对此我感到困惑。有人可以帮忙吗?谢谢!

1 个答案:

答案 0 :(得分:1)

在基数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

更新

要在Sepal.Length内的Group = "Low"Group = "High"之间对Species进行t检验,您可以

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与默认的Holm校正一起使用。