将多个参数传递给dplyr :: summarise_if

时间:2018-08-25 05:01:57

标签: r dplyr tidyverse

我正在尝试创建一个使用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而引起的,但是我不确定如何解决此问题。

1 个答案:

答案 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网上论坛讨论。