同时对R中的整洁数据执行多个t.test

时间:2018-06-28 03:35:34

标签: r statistics tidyr tidyverse

我有一个类似于以下内容的数据集:

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,而不必像上面显示的那样创建单独的数据框。

3 个答案:

答案 0 :(得分:3)

我们可以通过'factor'和summariset.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$givelst$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