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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 04:47:12