我是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值,以此类推。对于每个列表,依此类推。
对此我感到困惑。有人可以帮忙吗?谢谢!
答案 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校正一起使用。