R:如何应用为多列输出数据帧的函数(使用 dplyr)?
R: How to apply a function that outputs a dataframe for multiple columns (using dplyr)?
我想找到数据框中一个特定列与所有其他列之间的相关性、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 每列的 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 和管道来做到这一点。
这是一个坚持 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)
我想找到数据框中一个特定列与所有其他列之间的相关性、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 每列的 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 和管道来做到这一点。
这是一个坚持 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)