我有一个类似于以下内容的数据集:
id samediff factor value
1 S give 3
1 S impact 4
2 S give 2
2 S impact 5
3 D give 1
3 D impact 4
4 D give 3
4 D impact 5
我想执行多个t检验,以比较S(samediff)条件下每个因子的均值与D(samediff)条件下相同因子的均值。
我知道我可以通过以下方式做到这一点:
dfgive<-filter(df, factor == "give")
t.test(value~samediff, dfgive)
dfimpact<-filter(df, factor == "impact")
t.test(value~samediff, dfimpact)
是否可以在更少的行中执行多个t.test?在实际数据集中,因素多于此处所包含的因素。我希望能够进行所有必要的t.test,而不必像上面显示的那样创建单独的数据框。
答案 0 :(得分:3)
我们可以通过'factor'和summarise
将t.test
的输出分组到list
library(dplyr)
out <- df %>%
group_by(factor) %>%
summarise(ttest = list(t.test(value ~ samediff)))
out
# A tibble: 2 x 2
# factor ttest
# <chr> <list>
#1 give <S3: htest>
#2 impact <S3: htest>
输出存储在list
列中,可以用$
或[[
提取
identical(out$ttest[[1]], t.test(value ~ samediff, dfgive))
#[1] TRUE
答案 1 :(得分:3)
我们可以将数据factor
分割,然后t.test
一一应用。最终输出是一个列表。我们可以通过lst$give
或lst$impact
访问结果。
library(tidyverse)
lst <- df %>%
split(.$factor) %>%
map(~t.test(value ~ samediff, .x))
数据
df <- read.table(text = "id samediff factor value
1 S give 3
1 S impact 4
2 S give 2
2 S impact 5
3 D give 1
3 D impact 4
4 D give 3
4 D impact 5 ",
header = TRUE, stringsAsFactors = FALSE)
答案 2 :(得分:2)
要增加现有答案,您可以使用broom::tidy
来整理t.test
的输出,例如
library(tidyverse)
library(broom)
df %>%
group_by(factor) %>%
summarise(ttest = list(t.test(value ~ samediff))) %>%
mutate(ttest = map(ttest, tidy)) %>%
unnest() %>%
select(factor, estimate, estimate1, estimate2, p.value)
# # A tibble: 2 x 5
# factor estimate estimate1 estimate2 p.value
# <chr> <dbl> <dbl> <dbl> <dbl>
# 1 give -0.5 2 2.5 0.712
# 2 impact 0 4.5 4.5 1
这是基本R方法:
results <- lapply(split(df, df$factor), function(X) {
out <- t.test(value ~ samediff, X)
data.frame(diff = out$statistic,
mean1 = out$estimate[1],
mean2 = out$estimate[2],
pval = out$p.value)
})
do.call(rbind, results)
# diff mean1 mean2 pval
# give -0.4472136 2.0 2.5 0.7117228
# impact 0.0000000 4.5 4.5 1.0000000