R dplyr group_by汇总时保留全样本统计值的单管道实现
解决方案
完全可以在单条连续管道里实现,不需要拆分流程存中间表,只要在分组前把全样本作为一个特殊分组加进数据集就行,你之前写好的过滤、汇总、转置、重排逻辑基本不用动。
调整要点
原来的逻辑是过滤缺失值后直接按big_four的0、1值分组,现在只要在过滤完、分组前,给当前数据集追加一份全量副本,给副本的big_four赋一个和0、1不冲突的特殊值(比如99,或者字符型的"total"),后续分组汇总时这个特殊组算出来的就是全样本统计值,最后重命名列的时候把这个组对应成Total列就完事。
代码框架
your_df |> # 原有的缺失值过滤逻辑,不用改 filter(!is.na(idade_em_2022), !is.na(total_de_cooperados)) |> # 新增:追加全样本副本,打特殊分组标记 bind_rows( mutate(., big_four = 99) # 99是全样本标记,和原有0/1不冲突就行 ) |> # 原有的分组汇总逻辑,完全不用改 group_by(big_four) |> summarise_at( .vars = vars(idade_em_2022, total_de_cooperados, numeroAgencias), .funs = list(minimo = min, media = mean, maximo = max, desvio = sd) ) |> # 接你原来写好的转置、列重命名、行名转列、拆分、排序逻辑就行 # 重命名列的时候多配一个映射:big_four=99的列命名为Total t() |> as.data.frame() |> # 重命名示例,对应三个分组:0、1、全样本 `colnames<-`(c("n_BigFour", "BigFour", "Total")) |> # 后面接你原来的后续处理步骤即可 ...
补充说明
- 要是你的
big_four字段本身就有99这个取值,换个没出现过的值当标记就行,比如先把big_four转成字符型,用"total"当标记,完全不影响三个数值字段的统计计算。 - 这种写法和你单独算完全表再拼的效率差不多,好处是全程管道不中断,不用写中间赋值语句打乱逻辑。
内容的提问来源于stack exchange,提问作者RxT
相关产品推荐
相关产品推荐

