dplyr嵌套group_by操作:二次分组会不会忽略首次的分组设置?
问题原因
dplyr的group_by()默认行为是覆盖已有分组,原代码第二次调用group_by(outcome)时直接丢弃了上一步设置的study分组,相当于对全表按outcome全局分组,因此无法实现「每个study内部再按outcome分组计算」的需求。
解决方案
要保留原有分组同时新增分组,只需在第二次group_by()调用时添加.add = TRUE参数即可,该参数会在现有分组规则的基础上叠加新的分组变量,不会替换原有分组。
修改后的代码如下:
library(dplyr) set.seed(0) (data <- expand.grid(study = 1:2, outcome = rep(1:2,2))) data$X <- rnorm(nrow(data)) (data <- arrange(data,study)) res <- data %>% group_by(study) %>% mutate(X_between_st = mean(X), X_within_st = X-X_between_st) %>% # 增加.add = TRUE参数,保留已有study分组,新增outcome分组 group_by(outcome, .add = TRUE) %>% mutate(X_between_ou = mean(X), X_within_ou = X-X_between_ou) print(res, n = Inf)
如果你使用的是1.0.0之前的旧版dplyr,将
.add = TRUE替换为add = TRUE即可生效。
结果验证
运行后计算结果完全符合需求逻辑:
以study=1分组为例,outcome=1组的X均值为(1.2629543 + 0.4146414)/2 = 0.8387978,outcome=2组的X均值为(1.3297993 + (-0.9285670))/2 = 0.2006161,对应生成的去均值字段和人工计算结果完全一致。
内容的提问来源于stack exchange,提问作者Reza
相关产品推荐
相关产品推荐

