R语言将分组统计均值的for循环封装为自定义函数
问题根因分析
你遇到的返回结果仅包含第一个分组变量的问题,90%以上是两个常见编码错误导致:
- 循环内没有把每次分组的计算结果追加存入最终列表,而是每次直接覆盖了返回对象
- 函数的
return语句错误放在了for循环内部,第一次循环执行完成后就直接终止函数返回了
修正后可直接复用的代码
首先加载依赖包:library(psych)
自定义函数代码:
my_describe_by_binary <- function(data, group_vars, target_cols = colnames(data)) { # 初始化最终存储结果的列表 Summ.Stats <- list() # 遍历所有传入的二分类分组变量 for (g in group_vars) { # 分别计算分组取值为0、1的子集各目标列均值 mean_0 <- describe(data[data[[g]] == 0, target_cols])$mean mean_1 <- describe(data[data[[g]] == 1, target_cols])$mean # 合并为结构化对比表 res_df <- data.frame( variable = names(mean_0), group_0_mean = mean_0, group_1_mean = mean_1, row.names = NULL ) # 将当前分组的结果追加存入列表,命名对应分组变量名 Summ.Stats[[g]] <- res_df } # 循环全部执行完成后再返回完整列表,return必须放在循环外部 return(Summ.Stats) }
调用测试示例
# 按vs、am两个二分类变量分组,计算指定列的均值对比 b <- my_describe_by_binary( data = mtcars, group_vars = c("vs", "am"), target_cols = c("mpg", "disp", "hp", "drat", "wt") )
结果说明
- 输出的
b是长度和传入group_vars完全一致的列表 - 列表每个元素的命名对应分组变量名,每个元素存储对应分组下0、1两类的均值对比表
- 如果需要保留
describe函数返回的标准差、中位数等其他统计量,只需修改代码中提取$mean的部分,合并对应字段即可
内容的提问来源于stack exchange,提问作者symkly
相关产品推荐
相关产品推荐

