以整洁的方式将多列作为分组变量传递给 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
我想以整洁的方式将多列传递给一个 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