首页 > 解决方案 > 如何获取分组变量和函数(可能是 group_nest)?

问题描述

假设我有以下代码:

df <- data.frame(a=c(1,2,3), b=c(4,5,6), c=c(7,8,9))

func <- function(...) {
  the_args <- list(...)
  data <- the_args[[1]]
  message(names(data))
}

现在我想对 func 进行 3 次调用,每次调用a. 我想也许group_nest是我的朋友,但不完全是:

# func gets all rows instead of one group at a time
df %>% group_nest(a) %>% func()

# func gets one group at a time, but without a
df %>% group_nest(a) %>% mutate(result=map(data, func))

我想func被调用三次(a 的每个不同值一个),每次都包含所有三列(a、b、c)。

建议?

编辑:如果我提前知道分组,我可以提前硬编码:

df %>% group_nest(a) %>% mutate(result=map(data, func, a))

在我可以设置的功能内a <- the_args[[2]]

但是,我想要一个对不同分组具有弹性的结果,并传递一个完整的数据框(数据和分组列放在一起),因此func不必知道如何组装数据。

编辑 2:我的实际用例有更一般地指定的分组列,即类似于

grouping_cols <- c('a')
df %>% group_nest(across(all_of(grouping_cols))) %>%
  mutate(result=map(data, func))

标签: rdplyr

解决方案


对于最简单的情况,您可以

df %>% group_nest(a_ = a)

正如OP所指出的,您还可以将变量用于更通用的情况

df %>% group_nest(foo = across(all_of(grouping_cols)))

另一种选择是

df %>% 
  mutate(across(!!grouping_cols, `(`, .names = "{.col}_")) %>%
  group_nest(across(paste0(grouping_cols, "_"))

推荐阅读