对分组为R的变量运行多个T检验(不使用rstatix)



我有一个数据框架,其中包含不同的项目(以及成本(和后续分组。我想根据每个项目的分组对它们进行T测试,看看它们的平均值是否不同。有人知道如何在不使用rstatix包的情况下在R中做到这一点吗?如果可能的话,在R底面上用搭接或打圈。提迪尔和dplyr很好。

数据帧的示例如下:

df = structure(list(Item = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L), .Label = c("Book A", 
"Book B", "Book C", "Book D"), class = "factor"), Cost = c(7L, 
9L, 6L, 7L, 4L, 6L, 5L, 3L, 5L, 4L, 7L, 2L, 2L, 4L, 2L, 9L, 4L
), Grouping = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 
1L, 1L, 2L, 2L, 1L, 2L, 2L, 1L), .Label = c("A", "B"), class = "factor")), class = "data.frame", row.names = c(NA, 
-17L))
第A册第B册>第B册第B册第B册第B册>
项目成本分组
A书7
书籍A9B
书籍A6A
书籍A7B
第B册4
第B册6
书籍B5A
第B册3
第C册5册
书籍C4A
第C册7
第C册2
第C册2
书籍D4A
第D册2
第D册9册
书籍D4A

错误与"分组"中的观测值数量有关。有一种情况是有一个观察。使用base R,我们可以将其作为

lapply(split(df, df$Item), function(x) if(any(table(x$Grouping) < 2)) 
NA else t.test(Cost ~ Grouping, data = x))

-输出

$`Book A`
Welch Two Sample t-test
data:  Cost by Grouping
t = -1.3416, df = 1.4706, p-value = 0.3499
alternative hypothesis: true difference in means between group A and group B is not equal to 0
95 percent confidence interval:
-8.418523  5.418523
sample estimates:
mean in group A mean in group B 
6.5             8.0 

$`Book B`
[1] NA
$`Book C`
Welch Two Sample t-test
data:  Cost by Grouping
t = 1.3868, df = 1.8989, p-value = 0.3059
alternative hypothesis: true difference in means between group A and group B is not equal to 0
95 percent confidence interval:
-5.666332 10.666332
sample estimates:
mean in group A mean in group B 
5.5             3.0 

$`Book D`
Welch Two Sample t-test
data:  Cost by Grouping
t = -0.42857, df = 1, p-value = 0.7422
alternative hypothesis: true difference in means between group A and group B is not equal to 0
95 percent confidence interval:
-45.97172  42.97172
sample estimates:
mean in group A mean in group B 
4.0             5.5 

或者获取pvalue

stack(lapply(split(df, df$Item), function(x) if(any(table(x$Grouping) < 2)) 
NA else t.test(Cost ~ Grouping, data = x)$p.value))[2:1]
ind    values
1 Book A 0.3498856
2 Book B        NA
3 Book C 0.3058987
4 Book D 0.7422379

dplyr也可以采用相同的方法

library(dplyr)
df %>% 
add_count(Item, Grouping) %>%
group_by(Item) %>%
summarise(out = list(if(any(n < 2)) NA else t.test(Cost ~ Grouping)))

-输出

# A tibble: 4 × 2
Item   out      
<fct>  <list>   
1 Book A <htest>  
2 Book B <lgl [1]>
3 Book C <htest>  
4 Book D <htest>  

如果只需要p值

df %>% 
add_count(Item, Grouping) %>%
group_by(Item) %>%
summarise(out = if(any(n < 2)) NA_real_ else t.test(Cost ~ Grouping)$p.value)
# A tibble: 4 × 2
Item      out
<fct>   <dbl>
1 Book A  0.350
2 Book B NA    
3 Book C  0.306
4 Book D  0.742

最新更新