如何为不同球队分组创建累计投篮命中率列(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
相关产品推荐
相关产品推荐

