更优编码实践:使用dplyr循环生成统计汇总结果
用循环简化R语言多变量分组统计的重复代码
嘿,我懂你现在的烦恼——重复写几乎一模一样的代码既繁琐,后续改逻辑的时候还容易漏改。咱们可以把重复的统计逻辑封装成函数,再通过循环遍历目标变量的方式来批量处理,彻底告别重复代码!
第一步:封装统计逻辑为函数
先把你对单个变量做的分组统计逻辑写成一个可复用的函数,这样不管是R_D$还是Returns$,甚至以后加新变量,都能直接用这个函数处理:
# 定义一个处理单个变量分组统计的函数 get_group_summary <- function(data, var_col) { # 生成summary的分位数、均值等统计量 summary_part <- data %>% group_by(Year) %>% do(data.frame(as.list(summary(.[[var_col]])), check.names = FALSE)) # 单独计算总和与标准差(加入na.rm避免缺失值报错) sum_sd_part <- data %>% group_by(Year) %>% summarise( sum = sum(.[[var_col]], na.rm = TRUE), sd = sd(.[[var_col]], na.rm = TRUE), .groups = "drop" # 取消分组,避免后续合并时的分组冲突 ) # 合并两部分结果,再添加变量标识列(方便区分不同变量的统计结果) final_result <- summary_part %>% left_join(sum_sd_part, by = "Year") %>% mutate(variable = var_col) return(final_result) }
第二步:批量处理目标变量
接下来定义你要处理的变量列表,然后用循环或者lapply批量生成统计结果:
方式1:用lapply批量处理并合并成一个总表
如果想把所有变量的统计结果放在同一个数据框里,方便对比查看,可以这么做:
# 定义需要处理的变量名 target_variables <- c("R_D$", "Returns$") # 批量处理所有变量 all_summary <- lapply(target_variables, function(var) get_group_summary(df, var)) # 合并成一个完整的数据框 combined_summary <- dplyr::bind_rows(all_summary)
方式2:用for循环单独保存每个变量的结果
如果你还是想保留原来的命名(比如R_DYear、Returns_Year),可以用循环给每个结果单独赋值:
# 遍历每个目标变量 for (var in target_variables) { # 生成对应的结果名称(去掉变量名里的$,再加上_Years后缀) result_name <- gsub("\\$", "", var) %>% paste0("_Year") # 将统计结果赋值到全局环境 assign(result_name, get_group_summary(df, var)) }
效果说明
运行完上面的代码后,R_DYear和Returns_Year的结果会和你手动写重复代码得到的完全一致,而且还多了一个variable列用来标识统计的是哪个变量,同时加入了na.rm = TRUE让代码更健壮(避免数据中有缺失值时统计结果变成NA)。
以后如果需要加新的变量做同样的统计,只需要把变量名加到target_variables列表里就行,完全不用改统计逻辑~
内容的提问来源于stack exchange,提问作者Ian_De_Oliveira
相关产品推荐
相关产品推荐

