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

如何在大型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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:15:04