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

在R中使用dplyr识别列排名并实现统计值加权求和

用dplyr实现基于学生记录数的加权求和

嘿,我懂你纠结的点了——想用每个学生的记录条数来给他们的统计项做加权求和,对吧?其实用dplyr完全可以轻松实现,我给你一步步拆解:

首先,先构造和你示例一致的测试数据(额外加了个Stat_2方便演示不同数值的情况):

library(dplyr)

# 构造示例学生数据
student_data <- tibble(
  Name = c("A", "B", "A", "A", "B", "C"),
  Yr. = c("Fr.", "Fr.", "So.", "Jr.", "So.", "Sr."),
  Stat_1 = rep(5, 6),
  Stat_2 = c(3, 4, 2, 6, 1, 5)
)

方法一:先计算记录数再逐行加权

这个方法适合你需要保留每行数据,同时查看每行的加权值的场景:

weighted_data <- student_data %>%
  group_by(Name) %>%
  mutate(
    # 计算每个学生的总记录数
    student_record_count = n(),
    # 对每个统计项做加权(统计项值 × 学生总记录数)
    weighted_Stat1 = Stat_1 * student_record_count,
    weighted_Stat2 = Stat_2 * student_record_count
  )

# 查看结果
weighted_data

如果需要每个学生的总加权求和值,可以在此基础上再做汇总:

student_weighted_totals <- weighted_data %>%
  group_by(Name) %>%
  summarise(
    student_record_count = first(student_record_count),
    total_weighted_Stat1 = sum(weighted_Stat1),
    total_weighted_Stat2 = sum(weighted_Stat2)
  )

student_weighted_totals

方法二:直接在汇总时计算(更高效)

如果你只需要每个学生的总加权求和结果,不需要保留每行数据,那么可以一步到位,省去中间的mutate步骤,效率更高:

student_weighted_totals <- student_data %>%
  group_by(Name) %>%
  summarise(
    student_record_count = n(),
    # 先统计每个学生的统计项总和,再乘以记录数得到加权总和
    total_weighted_Stat1 = sum(Stat_1) * student_record_count,
    total_weighted_Stat2 = sum(Stat_2) * student_record_count
  )

student_weighted_totals

两种方法得到的结果是完全一致的,你可以根据自己的需求选择更合适的方式。

内容的提问来源于stack exchange,提问作者a.powell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:54:17