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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:47:46