在R中如何通过循环批量汇总多变量对应分组列的统计指标
实现代码
首先加载依赖包:
library(dplyr) library(purrr)
步骤1:自动识别所有基础变量名
# 自动提取A/B/C/D这类核心变量名,排除ID、Status、Group_*、WOE_*类列 all_cols <- colnames(df) base_vars <- all_cols[!all_cols %in% c("ID", "Status") & !startsWith(all_cols, "Group_") & !startsWith(all_cols, "WOE_")]
步骤2:定义单变量统计函数
calc_var_stats <- function(var_name) { # 生成当前变量对应的三个关联列名 group_col <- paste0("Group_", var_name) woe_col <- paste0("WOE_", var_name) # 按分组列聚合计算所需统计量 df %>% group_by(!!sym(group_col)) %>% summarise( "Min({var_name})" := min(!!sym(var_name), na.rm = TRUE), "Max({var_name})" := max(!!sym(var_name), na.rm = TRUE), "{woe_col}" := first(!!sym(woe_col)), "Count(Group_{var_name})" := n(), "Count_1(Group_{var_name}, where Status=1)" := sum(Status == 1, na.rm = TRUE), "Count_0(Group_{var_name}, where Status=0)" := sum(Status == 0, na.rm = TRUE) ) %>% rename(Group = 1) # 分组列统一重命名为Group,匹配你需要的输出格式 }
步骤3:批量处理所有变量
# 批量生成所有变量的统计结果,存储为命名列表 stats_list <- map(base_vars, calc_var_stats) names(stats_list) <- paste0("Var ", base_vars) # 查看指定变量的统计结果,例如查看A的结果: print(stats_list[["Var A"]])
如果你偏好for循环实现,可替换步骤3为以下代码:
stats_list <- list() for (var_name in base_vars) { group_col <- paste0("Group_", var_name) woe_col <- paste0("WOE_", var_name) stats_df <- df %>% group_by(!!sym(group_col)) %>% summarise( "Min({var_name})" := min(!!sym(var_name), na.rm = TRUE), "Max({var_name})" := max(!!sym(var_name), na.rm = TRUE), "{woe_col}" := first(!!sym(woe_col)), "Count(Group_{var_name})" := n(), "Count_1(Group_{var_name}, where Status=1)" := sum(Status == 1, na.rm = TRUE), "Count_0(Group_{var_name}, where Status=0)" := sum(Status == 0, na.rm = TRUE) ) %>% rename(Group = 1) stats_list[[paste0("Var ", var_name)]] <- stats_df }
说明
- 代码中的
!!sym()是dplyr动态引用列名的标准语法,:=用于动态生成统计结果的列名 - 同一分组下WOE值固定,因此用
first()取第一个值即可,也可替换为max()/min(),结果一致 - 最终输出的
stats_list为命名列表,每个元素对应该变量的统计表格,完全符合你要求的输出格式
内容的提问来源于stack exchange,提问作者Laura Badea
相关产品推荐
相关产品推荐

