如何使用dplyr以其余所有列为条件对单列执行聚合运算
动态分组聚合实现方案
你可以通过动态生成分组条件的方式实现需求,不需要手动枚举所有分组列,仅需指定待聚合的目标列即可,适配任意列数、任意列名规则的场景,两种常用实现方式如下:
方法1:使用dplyr包(当前tidyverse生态主流方案,更推荐)
library(dplyr) # 第一步:指定你要聚合的目标列名,此处示例为数据中的F3 target_col <- "F3" # 自动将除目标列外的所有列作为分组键,完成聚合 df_agg <- df %>% group_by(across(!all_of(target_col))) %>% summarise(!!target_col := sum(.data[[target_col]]), .groups = "drop")
运行后你给出的示例数据会自动合并V1=F、V2=G、V4=G、V5=G的两行,F3聚合结果为25,其余分组唯一的行保持原值。
方法2:沿用plyr包的ddply写法
如果你习惯使用原来的plyr包逻辑,可以通过动态构造分组公式实现:
library(plyr) # 指定待聚合的目标列名 target_col <- "F3" # 自动提取除目标列外的所有列作为分组列 group_cols <- setdiff(colnames(df), target_col) # 动态生成分组公式 group_formula <- as.formula(paste0("~", paste(group_cols, collapse = "+"))) # 执行聚合 df1 <- ddply(df, group_formula, summarise, !!target_col := sum(.data[[target_col]]))
两种方法都不需要修改分组相关的代码,仅需修改target_col的取值为你实际要聚合的列名即可。
内容的提问来源于stack exchange,提问作者Tanya Valkanova
相关产品推荐
相关产品推荐

