R语言按姓名及2年区间分组对不同列分别求和与求均值
R实现按姓名+2年区间分组聚合计算
核心思路
处理这类分组聚合问题分三步即可:
- 先给每行数据打上对应的2年区间标签,示例默认用偶数年为起点的2年跨度(2010-2011、2012-2013),如果区间起始规则有调整可以自行修改标签生成逻辑
- 按姓名、年份区间两个维度分组
- 按规则聚合:Jumps直接计算分组总和;Success不要用普通算术平均,成功率这类指标要按Jumps数加权计算(总成功次数/总跳跃次数),结果才符合业务逻辑,这也是普通均值无法满足需求的核心原因。
可直接运行的代码
用dplyr包实现,哪怕是百万行级别的大表运行速度也很快:
# 未安装依赖先运行这行:install.packages("dplyr") library(dplyr) # 示例数据 Name <- c(rep("Joe",3),rep("Kenny",3)) Age <- c(20,21,22,19,20,21) Year <- c(rep(c(2010,2011,2012),length.out = 6)) Jumps <- c(10,150,200,300,20,90) Success <- c(0.5,0.6,0.7,0.4,0.5,0.6) df <- data.frame(Name,Age,Year,Jumps,Success) # 聚合计算 res <- df %>% mutate( # 计算所属2年区间的起始年份 interval_start = Year - Year %% 2, year_interval = paste0(interval_start, "-", interval_start + 1) ) %>% group_by(Name, year_interval) %>% summarise( total_jumps = sum(Jumps), avg_success = weighted.mean(Success, w = Jumps), # 加权平均替代普通算术均值 .groups = "drop" )
运行结果
输出和期望效果完全一致:
# A tibble: 4 × 4 Name year_interval total_jumps avg_success <chr> <chr> <dbl> <dbl> 1 Joe 2010-2011 160 0.594 2 Joe 2012-2013 200 0.7 3 Kenny 2010-2011 320 0.406 4 Kenny 2012-2013 90 0.6
如果需要调整2年区间的起始偏移,比如要2011-2012、2013-2014为一组,只需要修改
interval_start的计算规则即可,例如改成interval_start = Year - (Year - 2011) %% 2就能实现自定义起始点。

内容的提问来源于stack exchange,提问作者Zach Rosenberg
相关产品推荐
相关产品推荐

