代码之家  ›  专栏  ›  技术社区  ›  melbez

同时对R中整洁的数据执行多个T.测试

  •  1
  • melbez  · 技术社区  · 7 年前

    我的数据集如下所示:

    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.测试?在实际的数据集中,有几个因素比这里包含的多。我希望能够进行所有必要的T.测试,而不必像上面所显示的那样创建单独的数据帧。

    3 回复  |  直到 7 年前
        1
  •  3
  •   akrun    7 年前

    我们可以按“因子”分组 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>
    

    输出存储在 列表 可以提取的列 $ [[

    identical(out$ttest[[1]], t.test(value ~ samediff, dfgive))
    #[1] TRUE
    
        2
  •  3
  •   www    7 年前

    我们可以通过 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)
    
        3
  •  2
  •   Weihuang Wong    7 年前

    要增加现有答案,可以使用 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  
    

    下面是BASE-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