如何在R中用数据透视表统计学生期初期末基准类别变化
解决R语言生成学生基准类别流动交叉计数表的问题
问题核心
需要生成以期初基准类别为行、期末基准类别为列的交叉计数表,统计不同类别间的学生流动数量,但原有代码仅统计了各时间段内的单类别人数,未关联学生的期初期末结果。
原有代码的问题
你之前的代码按TestingWindow和BenchmarkCategories分组统计人数,本质是分别计算期初、期末各基准类别的学生数,没有把同一个学生的期初、期末结果对应起来,因此无法得到类别间的流动数据。
解决方案
核心思路是先将每个学生的期初、期末基准类别合并到同一行,再统计不同类别组合的学生数量。
步骤1:构造示例数据
library(tidyverse) # 模拟你的学生数据 reading_data <- tibble( studentIDs = c(123, 456, 456, 789, 789), TestingWindow = c("StartofYear", "StartofYear", "EndofYear", "StartofYear", "EndofYear"), BenchmarkCategories = c("Urgent Intervention", "Intervention", "At Benchmark", "On Watch", "Above Benchmark") )
步骤2:将学生的期初/期末结果转成宽格式
把每个学生的期初、期末基准类别放到同一行,缺失期末结果的学生对应字段为NA:
student_benchmarks <- reading_data %>% pivot_wider( id_cols = studentIDs, names_from = TestingWindow, values_from = BenchmarkCategories ) %>% rename( 期初基准 = StartofYear, 期末基准 = EndofYear )
步骤3:生成交叉流动计数表
有两种常用方法:
方法1:用tidyverse工具链
flow_table <- student_benchmarks %>% count(期初基准, 期末基准) %>% pivot_wider( names_from = 期末基准, values_from = n, values_fill = 0 # 无流动数据的组合填充为0 )
方法2:用base R的table函数(更简洁)
# 生成交叉表,转成数据框格式 flow_table <- as.data.frame.matrix(table(student_benchmarks$期初基准, student_benchmarks$期末基准)) # 可手动修改行/列名 colnames(flow_table) <- paste0("期末_", colnames(flow_table)) rownames(flow_table) <- paste0("期初_", rownames(flow_table))
最终结果说明
生成的flow_table中,行是学生期初的基准类别,列是期末的基准类别,单元格数值代表从对应期初类别流动到对应期末类别的学生数量;缺失期末结果的学生会被统计到NA列(可手动重命名为“无期末结果”)。
内容的提问来源于stack exchange,提问作者TheTechnocrat
相关产品推荐
相关产品推荐

