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

R语言数据重塑与最大值筛选:将HAVE转换为WANT数据集

R 数据转换实现方案

原始数据集

HAVE 数据集

HAVE = data.frame(
  "WEEK"=c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2),
  "STUDENT"=c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3),
  "CLASS"=c('A', 'A', 'B', 'B', 'C', 'C', 'H', 'A', 'A', 'B', 'B', 'C', 'C', 'H', 'A', 'A', 'B', 'B', 'C', 'C', 'H', 'A', 'A', 'B', 'B', 'C', 'C', 'H', 'A', 'A', 'B', 'B', 'C', 'C', 'H', 'A', 'A', 'B', 'B', 'C', 'C', 'H'),
  "TEST"=c(1, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 1),
  "SCORE"=c(93, 97, 72, 68, 93, 51, 19, 88, 56, 53, 79, 69, 90, 61, 74, 50, 76, 97, 55, 63, 63, 59, 68, 77, 80, 52, 94, 74, 64, 74, 92, 98, 89, 84, 54, 51, 82, 86, 51, 90, 72, 86)
)

目标数据集 WANT

WANT = data.frame(
  "WEEK"=c(1,1,1,2,2,2),
  "STUDENT"=c(1,2,3,1,2,3),
  "CLASS"=c('A','A','B','B','B','C'),
  "H"=c(19,61,63,74,54,86),
  "TEST1"=c(93,88,76,77,92,90),
  "TEST2"=c(97,56,97,80,98,72)
)

需求说明

按 WEEK 和 STUDENT 分组,完成以下操作:

  • 找出每组中 TEST=1 时 SCORE 最大值对应的 CLASS
  • 获取该 CLASS 下 TEST=2 的 SCORE
  • 添加 H 列,值为每组中 CLASS='H' 对应的 SCORE
  • 最终转换为 WANT 的结构

实现代码(使用 dplyr 包)

library(dplyr)

result <- HAVE %>%
  # 按周和学生分组
  group_by(WEEK, STUDENT) %>%
  # 提取H类分数,标记TEST=1记录,计算TEST=1的最高分数
  mutate(
    H = SCORE[CLASS == 'H'],
    is_test1 = TEST == 1,
    max_test1_score = max(SCORE[is_test1])
  ) %>%
  # 筛选出TEST=1且分数为最大值的记录,得到目标CLASS
  filter(is_test1 & SCORE == max_test1_score) %>%
  # 关联同组同CLASS下TEST=2的分数
  left_join(
    HAVE %>% filter(TEST == 2),
    by = c("WEEK", "STUDENT", "CLASS"),
    suffix = c("_test1", "_test2")
  ) %>%
  # 整理列名和结构
  select(
    WEEK, STUDENT, CLASS,
    H = H_test1,
    TEST1 = SCORE_test1,
    TEST2 = SCORE_test2
  ) %>%
  # 去重(避免同组多个CLASS出现相同最高分数的情况)
  distinct() %>%
  ungroup()

# 查看结果
print(result)

代码解释

  1. 分组计算:通过 group_by 按周和学生分组,提前计算每组的H类分数、TEST=1的标记及最高分数。
  2. 筛选目标CLASS:过滤出TEST=1且分数为最大值的记录,锁定需要的CLASS。
  3. 关联TEST2分数:用 left_join 匹配同组同CLASS下TEST=2的分数。
  4. 结构整理:选择并重命名列,确保输出和WANT结构完全一致。

内容的提问来源于stack exchange,提问作者bvowe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 08:45:39