我正在尝试创建一个使用summarise_if(或summarise_at)的函数来计算数据集中的一列与许多其他列之间的相关性。
data_set <- data.frame(grp = rep(c("a","b","c"), each =
3), x = rnorm(9), y = rnorm(9), z = rnorm(9))
multiple_cor <- function(d, vars){
d %>%
dplyr::group_by(grp) %>%
dplyr::summarise_at(vars, cor, x) %>%
return()
}
multiple_cor(data_set, vars = c("y","z") )
出现错误:
Error in dots_list(...) : object 'x' not found
Called from: dots_list(...)
我很确定这是由于cor
函数未在正确的环境中评估x
而引起的,但是我不确定如何解决此问题。
答案 0 :(得分:3)
summarise_at
有一个funs参数,因此它可以处理匿名函数。我在函数内部创建了一个名为cors的函数,并将其传递给funs参数内部的summarise_at
来处理x。
multiple_cor <- function(d, vars){
cors <- function(x, a = NULL) {
stats::cor(x, a)
}
d %>%
dplyr::group_by(grp) %>%
dplyr::summarise_at(vars, funs(cors(x, .))) %>%
return()
}
multiple_cor(data_set, vars = c("y","z") )
# A tibble: 3 x 3
grp y z
<fct> <dbl> <dbl>
1 a 0.803 0.894
2 b -0.284 -0.949
3 c 0.805 -0.571
该函数的结果与以下代码行完全相同:
data_set %>%
group_by(grp) %>%
summarise(cxy = cor(x, y),
cxz = cor(x, z))
# A tibble: 3 x 3
grp cxy cxz
<fct> <dbl> <dbl>
1 a 0.803 0.894
2 b -0.284 -0.949
3 c 0.805 -0.571
阅读this dplyr文档。
还有this Google网上论坛讨论。