【问题标题】:Passing multiple arguments to function in dplyr::summarise_if将多个参数传递给 dplyr::summarise_if 中的函数
【发布时间】:2026-02-04 17:40:01
【问题描述】:

我正在尝试制作一个函数,该函数使用 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,但我不确定如何解决这个问题。

【问题讨论】:

标签: r dplyr tidyverse


【解决方案1】:

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

阅读thisdplyr 文档。

还有thisgoogle 群讨论。

【讨论】: