如何在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
相关产品推荐
相关产品推荐

