R语言dplyr分组求差值:计算学生两次测试分数差并补NA
解决方案:计算学生两次测试的分数差值
问题根源
你原代码使用mutate会保留原数据的所有行,无法实现每个学生仅一行的目标;同时当学生缺少某一测试时间时,直接取SCORE[TIME==x]会因向量长度不匹配导致计算异常。
方法一:分组汇总计算
通过分组后判断是否存在两次测试记录,再计算差值:
library(dplyr) # 原数据集 DATA = data.frame(STUDENT=c(1, 1, 2, 2, 3, 3, 4, 5), TIME=c(1, 2, 1, 2, 1, 2, 2, 1), SCORE=c(6, 9, 9, 5, 5, 5, 8, 9)) # 生成目标数据集 DATA2 = DATA %>% group_by(STUDENT) %>% summarize( SCOREDIFFERENCE = { score_t2 = SCORE[TIME == 2] score_t1 = SCORE[TIME == 1] # 仅当两次记录都存在时计算差值,否则返回NA if (length(score_t2) == 1 && length(score_t1) == 1) { score_t2 - score_t1 } else { NA_real_ } } )
方法二:转换宽表计算(更简洁)
先将长表转宽表,缺失测试记录自动填充为NA,直接计算差值即可:
library(dplyr) library(tidyr) DATA2 = DATA %>% # 将TIME转为列名,SCORE作为对应值 pivot_wider(names_from = TIME, values_from = SCORE, names_prefix = "SCORE_") %>% # 缺失值相减自动返回NA mutate(SCOREDIFFERENCE = SCORE_2 - SCORE_1) %>% # 保留目标列 select(STUDENT, SCOREDIFFERENCE)
两种方法均可得到目标数据集:
> DATA2 # A tibble: 5 × 2 STUDENT SCOREDIFFERENCE <dbl> <dbl> 1 1 3 2 2 -4 3 3 0 4 4 NA 5 5 NA
内容的提问来源于stack exchange,提问作者bvowe
相关产品推荐
相关产品推荐

