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

如何对R中数据帧的几列应用统计测试

  •  1
  • sbac  · 技术社区  · 2 年前

    我想应用这个测试,而不仅仅是列 x1 ,正如我在本例中所做的那样,但在 df .在这种情况下 x1 x2 .

    我试着把这段代码放在一个函数中,并使用 purrr::map 但我做不好。

    library(tidyverse)
    
    df <- tibble(skul = c(rep('a',60), rep('b', 64)),
                 x1 = sample(1:10, 124, replace = TRUE),
                 x2 = sample(1:10, 124, replace = TRUE),
                 i_f = c(rep(0, 30), rep(1, 30), rep(0, 32), rep(1, 32)))
    
    
    lapply(split(df, factor(df$skul)),
           function(x)wilcox.test(data=x, x1 ~ i_f,
                                  paired=FALSE))
    #> Warning in wilcox.test.default(x = c(10L, 5L, 8L, 4L, 6L, 3L, 10L, 2L, 10L, :
    #> cannot compute exact p-value with ties
    #> Warning in wilcox.test.default(x = c(3L, 3L, 4L, 9L, 8L, 10L, 5L, 5L, 4L, :
    #> cannot compute exact p-value with ties
    #> $a
    #> 
    #>  Wilcoxon rank sum test with continuity correction
    #> 
    #> data:  x1 by i_f
    #> W = 546, p-value = 0.1554
    #> alternative hypothesis: true location shift is not equal to 0
    #> 
    #> 
    #> $b
    #> 
    #>  Wilcoxon rank sum test with continuity correction
    #> 
    #> data:  x1 by i_f
    #> W = 565, p-value = 0.4781
    #> alternative hypothesis: true location shift is not equal to 0
    Created on 2022-04-13 by the reprex package (v2.0.1)
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   akrun    2 年前

    一种方法是在感兴趣的列上循环,作为 split ,用 reformulate 并应用 wilcox.test

    out <- lapply(split(df, df$skul), function(x) 
        lapply(setNames(c("x1", "x2"), c("x1", "x2")), function(y)
          wilcox.test(reformulate("i_f", response = y), data = x)))
    

    -输出

    > out$a
    $x1
    
        Wilcoxon rank sum test with continuity correction
    
    data:  x1 by i_f
    W = 452, p-value = 0.9822
    alternative hypothesis: true location shift is not equal to 0
    
    
    $x2
    
        Wilcoxon rank sum test with continuity correction
    
    data:  x2 by i_f
    W = 404.5, p-value = 0.5027
    alternative hypothesis: true location shift is not equal to 0
    

    如果我们想使用 tidyverse

    library(dplyr)
    df %>% 
       group_by(skul) %>% 
       summarise(across(c(x1, x2), 
       ~list(broom::tidy(wilcox.test(reformulate("i_f", cur_column())))))) 
    
    推荐文章