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

mel*_*bez 3 statistics r 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 
Run Code Online (Sandbox Code Playgroud)

我想执行几个 t.tests 来比较 S (samediff) 条件中每个因素的均值与 D (samediff) 条件中相同因素的均值。

我知道我可以通过以下方式做到这一点:

dfgive<-filter(df, factor == "give")
t.test(value~samediff, dfgive)

dfimpact<-filter(df, factor == "impact")
t.test(value~samediff, dfimpact) 
Run Code Online (Sandbox Code Playgroud)

有没有办法在更少的行中执行几个 t.tests?在实际数据集中,有比这里包含的更多的因素。我希望能够进行所有必要的 t.tests,而无需以我上面显示的相同方式创建单独的数据帧。

www*_*www 6

我们可以将数据拆分factort.test一一应用。最终输出是一个列表。我们可以通过lst$give或访问结果lst$impact

library(tidyverse)

lst <- df %>%
  split(.$factor) %>%
  map(~t.test(value ~ samediff, .x))
Run Code Online (Sandbox Code Playgroud)

数据

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)
Run Code Online (Sandbox Code Playgroud)


Wei*_*ong 5

要增加现有答案,您可以使用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  
Run Code Online (Sandbox Code Playgroud)

这是一个基于 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
Run Code Online (Sandbox Code Playgroud)


akr*_*run 4

我们可以按“因子”和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>
Run Code Online (Sandbox Code Playgroud)

输出存储在list可以使用$或提取的列中[[

identical(out$ttest[[1]], t.test(value ~ samediff, dfgive))
#[1] TRUE
Run Code Online (Sandbox Code Playgroud)