如何在R语言中按学生和季度计算跨年度分数差值生成WANT列
计算学生同学期跨年度成绩差值
需求说明
给定如下R数据框:
DATA = data.frame(STUDENT = c(1,1,1,1,1,1,2,2,2,2,2, 3,3,3), YEAR = c(2000, 2000, 2000, 2001, 2001, 2001, 2000, 2000, 2001, 2001, 2001, 2001, 2001, 2001), TRIMESTER= c(1,2,3,1,2,3,2,3,1,2,3,1,2,3), SCORE = c(5,7,8,9,10,3,4,6,3,1,2,3,6, 9), WANT = c(NA,NA,NA,4,3,-5,NA,NA,NA,-3,-4,NA,NA,NA))
需要生成WANT列,规则为:对每个学生,仅当存在上一年同学期的成绩记录时,计算当前年份成绩与上一年同学期成绩的差值;若无对应记录则填充NA。
解决方案
方法1:使用dplyr包
通过分组、排序后,利用lag()函数获取上一年的成绩并计算差值:
library(dplyr) # 计算WANT列 DATA <- DATA %>% # 按学生ID和学期分组 group_by(STUDENT, TRIMESTER) %>% # 组内按年份排序 arrange(YEAR, .by_group = TRUE) %>% # 计算当前成绩与上一年同学期成绩的差值 mutate(WANT_CALC = SCORE - lag(SCORE)) %>% # 取消分组 ungroup() # 查看结果 print(DATA)
方法2:使用data.table包
利用data.table的分组移位操作实现:
library(data.table) # 转换为data.table格式 setDT(DATA) # 按学生ID和学期分组,计算当前成绩与上一年同学期成绩的差值 DATA[, WANT_CALC := SCORE - shift(SCORE), by = .(STUDENT, TRIMESTER)] # 查看结果 print(DATA)
结果验证
两种方法生成的WANT_CALC列与原数据中的WANT列完全一致,符合需求。
内容的提问来源于stack exchange,提问作者bvowe
相关产品推荐
相关产品推荐

