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

如何在dplyr的summarise中正确调用匿名函数传递分组数据?

在dplyr的summarise中正确使用匿名函数处理分组数据

正确写法1:修正pick的调用方式

把匿名函数里的everything(.)改成everything(),去掉多余的.即可:

library(tidyverse)

tribble(
  ~A,   ~N,
  "a",   1,
  "a",   2,
  "a",   3,
  "a",   4,
  "a",   5,
  "b",   1,  
  "b",   2
) %>%
  group_by(A) %>%
  summarise(xxx = (function(x) {nrow(x)})(pick(everything())))

运行后得到预期结果:

# A tibble: 2 × 2
  A       xxx
  <chr> <int>
1 a         5
2 b         2

正确写法2:用cur_data()获取分组子数据框

cur_data()是dplyr专门用于获取当前分组子数据框的函数,直接传给匿名函数就能精准拿到分组后的数据:

tribble(
  ~A,   ~N,
  "a",   1,
  "a",   2,
  "a",   3,
  "a",   4,
  "a",   5,
  "b",   1,  
  "b",   2
) %>%
  group_by(A) %>%
  summarise(xxx = (function(x) nrow(x))(cur_data()))

同样能得到正确的分组统计结果。

错误原因解析

  • 用pick(everything(.))报错,是因为everything()里的.破坏了pick的上下文:在匿名函数的调用语境中,.不再指向分组后的子数据,而是变成了pick函数的内部占位符,导致pick无法识别分组后的列结构,触发下标越界错误。
  • 直接传.时,匿名函数里的.指向的是整个原始数据框,而非当前分组的子数据,所以得到的是总行数7,无法实现分组统计。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 21:12:34