按组折叠DataFrame:同时使用加权平均与求和聚合变量
按group_id分组聚合:求和+加权平均的实现
嘿,我来帮你搞定这个分组折叠的需求!你需要对var_1和var_2按group_id求和,对var_percent_1和var_percent_2用weighting列做加权平均对吧?下面我给你两种常用的实现方法,都是R里的主流方案。
首先,先把你的数据构建代码优化下,加上随机种子让结果可复现(不然每次运行生成的随机数都不一样,调试起来麻烦):
set.seed(123) # 设置随机种子,确保结果一致 group_id = c(1,1,1,2,2,3,3,3,3,3) var_1 = sample.int(20, 10) var_2 = sample.int(20, 10) var_percent_1 = rnorm(10,.5,.4) var_percent_2 = rnorm(10,.5,.4) weighting = sample.int(50, 10) df_to_collapse = data.frame(group_id,var_1,var_2,var_percent_1,var_percent_2,weighting)
方法1:使用dplyr(推荐,代码更清爽)
先确保你装了dplyr包,没装的话先跑install.packages("dplyr")。用tidyverse的语法,分组+聚合一步到位:
library(dplyr) df_collapsed <- df_to_collapse %>% group_by(group_id) %>% summarize( var_1_sum = sum(var_1, na.rm = TRUE), # 求和时加上na.rm,避免缺失值搞砸结果 var_2_sum = sum(var_2, na.rm = TRUE), var_percent_1_weighted = weighted.mean(var_percent_1, w = weighting, na.rm = TRUE), # 加权平均 var_percent_2_weighted = weighted.mean(var_percent_2, w = weighting, na.rm = TRUE) ) # 看看最终结果 print(df_collapsed)
方法2:使用base R(无需额外安装包)
如果不想加载第三方包,用base R的aggregate()也能实现,就是写法稍微繁琐一点:
# 先处理需要求和的变量 sum_results <- aggregate(cbind(var_1, var_2) ~ group_id, data = df_to_collapse, FUN = sum, na.rm = TRUE) # 再处理加权平均的变量,这里要自定义一个函数 weighted_results <- aggregate(cbind(var_percent_1, var_percent_2) ~ group_id, data = df_to_collapse, FUN = function(x, weights) weighted.mean(x, weights, na.rm = TRUE), weights = df_to_collapse$weighting) # 把两个结果合并起来 df_collapsed_base <- merge(sum_results, weighted_results, by = "group_id") # 给列名改个更清晰的名字(可选,但可读性更好) colnames(df_collapsed_base) <- c("group_id", "var_1_sum", "var_2_sum", "var_percent_1_weighted", "var_percent_2_weighted") print(df_collapsed_base)
两种方法输出的结果是完全一致的,看你习惯哪种写法啦~如果是日常数据处理,我更推荐dplyr,代码逻辑一目了然,后续维护也方便。
内容的提问来源于stack exchange,提问作者SeánMcK
相关产品推荐
相关产品推荐

