如何在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
相关产品推荐
相关产品推荐

