以整洁的方式将多列作为分组变量传递给 UDF

Passing multiple columns to a UDF as grouping variables in a tidy way

我想以整洁的方式将多列传递给一个 UDF 参数(作为裸列名称)。

示例:我有一个简单的函数,它将 mtcars 数据集的一列作为输入,并将其用作分组变量,通过汇总进行简单的计数操作。

library(tidyverse)

test_function <- function(grps){
  grps <- enquo(grps) 
  mtcars %>% 
    group_by(!!grps) %>% 
    summarise(Count = n())
}

如果我以“cyl”作为分组变量执行函数的结果:

test_function(grps = cyl)

-----------------

    cyl Count
  <dbl> <int>
1     4    11
2     6     7
3     8    14

现在假设我想将多列传递给参数“grps”,以便数据集按更多列分组。这是我想象的一些示例函数执行的样子:

test_function(grps = c(cyl, gear))
test_function(grps = list(cyl, gear))

预期结果如下所示:

    cyl  gear Count
  <dbl> <dbl> <int>
1     4     3     1
2     4     4     8
3     4     5     2
4     6     3     2
5     6     4     4
6     6     5     1
7     8     3    12
8     8     5     2

有没有办法将多个裸列传递给 UDF 的一个参数? I know about the "..." operator already 但由于实际上我有 2 个参数,我想可能传递不止一个裸列作为参数,因此“...”是不可行的。

您可以使用带有包含参数的 across() 函数,这适用于大多数 dplyr 动词。它将接受裸名或字符串:

test_function <- function(grps){
  mtcars %>% 
    group_by(across({{ grps }})) %>% 
    summarise(Count = n())
}

test_function(grps = c(cyl, gear))

`summarise()` has grouped output by 'cyl'. You can override using the `.groups` argument.
# A tibble: 8 x 3
# Groups:   cyl [3]
    cyl  gear Count
  <dbl> <dbl> <int>
1     4     3     1
2     4     4     8
3     4     5     2
4     6     3     2
5     6     4     4
6     6     5     1
7     8     3    12
8     8     5     2

test_function(grps = c("cyl", "gear"))

# Same output