You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

dplyr 1.0.0+中summarise能否传入整个分组数据框给自定义函数

解答

可以直接在summarise中实现传入分组子数据框的需求,不需要走nest() + purrr::map()的嵌套流程,dplyr官方提供了分组上下文专用函数cur_data()来获取当前分组对应的完整子数据框。

你只需要把预期写法里指代子数据框的d替换为cur_data()即可,示例代码如下:

library(tidyverse)

df <- tibble(
  grp = rep(1:2, each = 5), 
  x = c(rnorm(5, -0.25, 1), rnorm(5, 0, 1.5)),
  y = c(rnorm(5, 0.25, 1), rnorm(5, 0, 0.5)),
)

# 自定义接收数据框入参的测试函数
my_function <- function(d) {
  tibble(
    n = nrow(d),
    cor_xy = cor(d$x, d$y),
    mean_x = mean(d$x),
    mean_y = mean(d$y)
  )
}

# 直接在summarise中传入当前组子数据框
df %>% 
  group_by(grp) %>% 
  summarise(my_function(cur_data()))

相关说明

  • cur_data()仅在group_by()后的dplyr操作上下文(如summarise、mutate)中生效,返回值为剔除了分组列的当前组子数据框,和你预期中d指代的对象完全一致。
  • 如果你需要传入的子数据框包含分组列,替换为cur_data_all()即可。
  • 该写法和nest() + map() + unnest()的输出结果完全等价,但代码更简洁,执行效率更高,属于dplyr 1.0.0及以上版本支持的标准用法,和你举例的传入返回tibble函数的基础逻辑完全兼容,结果会自动按列展开,不需要额外做解嵌套操作。
  • 注意不要和列选取代词.data混淆,.data仅用于指定列,无法获取完整的分组子数据框。

内容的提问来源于stack exchange,提问作者danilinares

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 12:39:15