在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
相关产品推荐
相关产品推荐

