如何在大型dataframe中按游戏回合计算加权标准差
逐行计算游戏回合加权标准差实现方案
首先给出自定义加权标准差计算函数,无需额外依赖包,适配样本加权标准差计算需求:
# 自定义样本加权标准差函数 row_wtd_sd <- function(scores, weights) { # 过滤权重为0的无效观测 valid_idx <- weights > 0 s <- scores[valid_idx] w <- weights[valid_idx] # 有效样本不足2个时返回NA if (length(s) < 2) return(NA) # 计算加权均值 w_mean <- sum(s * w) / sum(w) # 计算分子:加权离均差平方和 numerator <- sum(w * (s - w_mean)^2) # 样本加权标准差分母,若需计算总体版直接替换为sum(w) denominator <- sum(w) - (sum(w^2)/sum(w)) return(sqrt(numerator / denominator)) }
方法1:tidyverse 实现(代码简洁易读,推荐)
自动匹配所有r开头的得分列和weight开头的权重列,无需手动列出100个玩家的列名:
library(dplyr) df <- df %>% rowwise() %>% mutate( weightedsd = row_wtd_sd( scores = c_across(starts_with("r")), weights = c_across(starts_with("weight")) ) ) %>% ungroup()
方法2:base R 实现(无第三方包依赖)
# 匹配得分列、权重列索引 score_cols <- grep("^r\\d{3}", colnames(df)) weight_cols <- grep("^weight\\d{3}", colnames(df)) # 逐行计算 df$weightedsd <- apply(df, 1, function(row_item) { scores <- as.numeric(row_item[score_cols]) weights <- as.numeric(row_item[weight_cols]) row_wtd_sd(scores, weights) })
注意事项
- 需保证得分列和权重列的命名顺序完全对应:比如
r001对应weight001、r100对应weight100,避免出现得分与权重匹配错误 - 若计算的是总体加权标准差,只需修改自定义函数中
denominator的取值为sum(w)即可 - 运行示例数据后得到的
weightedsd结果依次约为0.90、1.56、1.57
内容的提问来源于stack exchange,提问作者scarlett rouge
相关产品推荐
相关产品推荐

