You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 02:27:30