首页 文章

R:如何应用为多列输出数据帧的函数(使用dplyr)?

提问于
浏览
3

我想在一个特定列和数据帧中的所有其他列之间找到相关性,p值和95%CI . 'broom'包提供了一个示例,说明如何使用带有dplyr和管道的cor.test在两列之间执行此操作 . 对于mtcars,比如mpg列,我们可以与另一列运行相关:

library(dplyr)
library(broom)
mtcars %>% do(tidy(cor.test(.$mpg, .$cyl)))

estimate statistic      p.value parameter   conf.low  conf.high
1 -0.852162 -8.919699 6.112687e-10        30 -0.9257694 -0.7163171

输出是单行数据帧 . 我想为每列运行cor.test for mpg并将输出发送到一个单独的行 . 当mpg列与每个其他列配对时,所需的输出将如下所示:

estimate statistic      p.value parameter   conf.low     conf.high
cyl  -0.852162  -8.919699 6.112687e-10       30 -0.9257694 -0.7163171
disp -0.8475514 -8.747152 9.380327e-10       30 -0.9233594 -0.7081376
hp   -0.7761684 -6.742389 1.787835e-07       30 -0.8852686 -0.5860994
drat  0.6811719  5.096042 1.77624e-05        30 0.4360484  0.832201
wt   -0.8676594 -9.559044 1.293959e-10       30 -0.9338264 -0.7440872
qsec  0.418684   2.525213 0.01708199         30 0.08195487 0.6696186
vs    0.6640389  4.864385 3.415937e-05       30 0.410363 0.8223262
am    0.5998324  4.106127 0.0002850207       30 0.3175583  0.784452
gear  0.4802848  2.999191 0.005400948        30 0.1580618 0.7100628
carb -0.5509251  -3.61575 0.001084446        30 -0.754648 -0.2503183

请注意第一列中添加的行名称 . 它们显示哪个列与cor.test的mpg配对 . 理想情况下,我想用dplyr和管道来做这件事 .

1 回答

  • 5

    这是一个坚持 do 方法的解决方案 . 您缺少的步骤是收集数据,然后按变量分组 .

    library(dplyr)
    library(tidyr)
    library(broom)
    
    mtcars %>%
      gather(var, value, -mpg) %>%
      group_by(var) %>%
      do(tidy(cor.test(.$mpg, .$value))) %>%
      ungroup() %>%
      mutate(var = factor(var, names(mtcars)[-1])) %>%
      arrange(var)
    

    这里有一个更基本R方法的例子(虽然为方便起见我使用了管道,但它很容易适应)

    library(dplyr)
    library(broom)
    
    xvar <- "mpg"
    yvar <- names(mtcars)[!names(mtcars) %in% xvar]
    
    lapply(yvar,
           function(yvar, xvar, DF)
           {
             cor.test(DF[[xvar]], DF[[yvar]]) %>%
               tidy()
           },
           xvar,
           mtcars) %>%
      bind_rows() %>%
      mutate(yvar = yvar) %>%
      select(yvar, estimate:conf.high)
    

相关问题