以整齐的方式将多列作为分组变量传递给 UDF
Posted
技术标签:
【中文标题】以整齐的方式将多列作为分组变量传递给 UDF【英文标题】:Passing multiple columns to a UDF as grouping variables in a tidy way 【发布时间】:2021-07-27 10:08:31 【问题描述】:我想以整洁的方式将多列传递给一个 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 个参数,我可能希望将多个裸列作为参数传递,因此“...”是不可行的。
【问题讨论】:
所以你的意思是你想把它用作test_function(grps = c(cyl, gear))
或test_function(grps = list(cyl, gear))
而不是test_function(cyl, gear)
?
@Ronak Shah,没错。
【参考方案1】:
您可以使用 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的主要内容,如果未能解决你的问题,请参考以下文章