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

如何为不同球队分组创建累计投篮命中率列(R语言数据框)

按球队计算累计投篮命中率(R语言实现)

需求说明

针对包含多支球队的投篮数据,需要按球队分组,为每行计算截至当前行的累计投篮命中率——即当前及之前的命中总数除以总投篮尝试次数。示例数据如下:

# 带预期结果的示例数据
dat = data.frame(team = c("D", "D", "M", "D","M", "M"),
                 result = c(1,0,0,1,1,1),
                 ratio = c(1, 1/2, 0, 2/3, 1/2, 2/3))

实现思路与代码

下面提供两种R语言中常用的实现方式:

1. Base R 原生实现

利用ave()函数按球队分组,结合cumsum()计算累计命中数,seq_along()生成累计投篮次数:

# 初始化数据(不含ratio列)
dat = data.frame(team = c("D", "D", "M", "D","M", "M"),
                 result = c(1,0,0,1,1,1))

# 计算累计命中率
dat$ratio <- ave(dat$result, dat$team, FUN = function(x) {
  cumsum(x) / seq_along(x)
})

2. tidyverse(dplyr)实现

通过分组后用mutate()计算,代码更直观易读:

library(dplyr)

dat <- dat %>%
  group_by(team) %>%  # 按球队分组
  mutate(ratio = cumsum(result) / row_number()) %>%  # 累计命中数/累计投篮次数
  ungroup()  # 取消分组(可选,根据后续操作需求)

验证结果

运行上述代码后,dat$ratio的值会和示例中的预期结果完全一致:

print(dat)
#   team result     ratio
# 1    D      1 1.0000000
# 2    D      0 0.5000000
# 3    M      0 0.0000000
# 4    D      1 0.6666667
# 5    M      1 0.5000000
# 6    M      1 0.6666667

内容的提问来源于stack exchange,提问作者DR15

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 17:02:45