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

如何在R中构建表格展示学生历次测试成绩相对首次测试的变化

实现方案

不需要逐行生成后再绑定,通过分组匹配基准成绩+分组汇总的方式即可快速实现,代码简洁易维护。
核心思路是先为每位学生关联其首次测试的成绩作为基准,再对后续测试按「测试批次-本次成绩-首次成绩」维度统计人数,也可按需扩展按班级拆分统计。

完整可运行代码

library(tidyverse)

# 示例数据
df <- structure(list(Class = c("A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "B", "B"), 
                     Student = c("Mike", "Mike", "Mike", "Mike", "John", "John", "John", "Rose", "Rose", "Rose", "Rose", "Linda", "Linda", "Linda", "Linda"), 
                     Test = c(1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4), 
                     Score = c("A", "B", "B", "A", "C", "B", "A", "D", "B", "C", "D", "D", "C", "B", "B")), 
                row.names = c(NA, -15L), class = c("tbl_df", "tbl", "data.frame"))

# 生成目标统计表格
result <- df %>%
  # 分组匹配每位学生的首次测试成绩作为基准
  group_by(Class, Student) %>%
  mutate(first_test_score = first(Score, order_by = Test)) %>%
  ungroup() %>%
  # 排除首次测试,仅统计后续测试和首次的对比
  filter(Test != 1) %>%
  # 按维度统计人数
  count(Test, current_score = Score, first_test_score, name = "student_count") %>%
  # 转宽表更符合常规的交叉表呈现效果,行列分别对应当前成绩、首次成绩
  pivot_wider(names_from = current_score, values_from = student_count, values_fill = 0)

# 如需按班级拆分统计,修改count的分组维度即可
result_by_class <- df %>%
  group_by(Class, Student) %>%
  mutate(first_test_score = first(Score, order_by = Test)) %>%
  ungroup() %>%
  filter(Test != 1) %>%
  count(Class, Test, current_score = Score, first_test_score, name = "student_count") %>%
  pivot_wider(names_from = current_score, values_from = student_count, values_fill = 0)

输出结果可直接查看或导出为表格文件,结构和预期的目标效果完全匹配。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:39:00