以整齐的方式将多列作为分组变量传递给 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的主要内容,如果未能解决你的问题,请参考以下文章

我们可以传递一列而不是变量来访问列表的第 n 项吗?

如何通过传入变量而不是文字来使用多列的 groupBy

Java Spark-如何以多列作为参数调用UDF

如何将常量值传递给 Python UDF?

将带有变量的闭包传递给 Laravel 查询构建器中的 where 方法

如何在 Java 的 UDF 中获取 hive 变量的值?