dplyr中group_vars()返回值与group_by()变量不符的技术疑问
问题原因与解决方法
这是因为dplyr里的summarise()函数默认会剥离最内层的分组,具体逻辑如下:
- 当存在多层分组(比如示例1的
cyl, vs),执行summarise()后,最内层的分组会被移除,仅保留外层分组,所以此时group_vars()只会返回剩下的外层分组cyl。 - 当只有单个分组(比如示例2的
cyl),执行summarise()后,这个唯一的分组会被直接剥离,数据框变回非分组状态,因此group_vars()返回character(0)。
如果想保留所有原始分组,只需在summarise()里添加.groups = "keep"参数:
示例1修改版
library(tidyverse) mtcars %>% group_by(cyl, vs) %>% summarise(cyl_n = n(), .groups = "keep") %>% group_vars() # 返回 "cyl" "vs"
示例2修改版
mtcars %>% group_by(cyl) %>% summarise(cyl_n = n(), .groups = "keep") %>% group_vars() # 返回 "cyl"
另外补充.groups参数的常用选项:
drop_last:默认行为,移除最内层分组keep:保留所有原始分组drop:移除所有分组,返回普通数据框rowwise:将结果转为按行分组的格式
内容的提问来源于stack exchange,提问作者anderwyang
相关产品推荐
相关产品推荐

