如何用R将学校级聚合数据转换为学生级明细数据集?
在R中将学校级聚合数据转换为学生级明细数据
数据转换实现代码
针对你的学校级聚合数据,我们可以用dplyr和tidyr包高效完成向学生级明细数据的转换,无需手动循环:
# 加载所需包 library(dplyr) library(tidyr) # 假设你的原始数据集名为df,执行以下转换 student_level_df <- df %>% # 将不及格/及格人数拆分为两行记录 pivot_longer( cols = c(不及格人数, 及格人数), names_to = "count_type", values_to = "student_count" ) %>% # 映射生成及格状态列 mutate(及格状态 = ifelse(count_type == "不及格人数", "N", "Y")) %>% # 根据人数展开为对应行数的学生记录 uncount(student_count) %>% # 保留核心字段,移除临时辅助列 select(学校ID, 及格状态, 城区标识, `%FSM`)
这段代码会自动为每所学校生成对应数量的学生行:比如学校ID=1的记录会生成12条及格状态=N、43条及格状态=Y的行,同时保留学校的城区标识、%FSM等属性。对于3200所学校的规模,该向量化操作的效率远高于循环,能快速完成转换。
关于你的统计任务的补充提示
1. 城区与乡村学校及格率差异分析
转换为学生级数据后,可通过卡方检验或逻辑回归模型验证差异显著性:
# 卡方检验 chisq.test(table(student_level_df$城区标识, student_level_df$及格状态)) # 逻辑回归模型(可输出更详细的显著性结果) glm_fit <- glm(及格状态 ~ 城区标识, data = student_level_df, family = binomial()) summary(glm_fit)
2. Beta回归模型构建
注意:Beta回归针对的是比例型响应变量,你完全可以直接用学校级的及格率(及格人数/参考总人数)建模,无需转换为学生级数据,这会大幅降低计算量:
library(betareg) # 先计算学校级及格率 df$及格率 <- df$及格人数 / df$参考总人数 # 拟合Beta回归模型 beta_fit <- betareg(及格率 ~ 城区标识 + `%FSM`, data = df) summary(beta_fit)
这种方式更适合3200条学校数据的规模,结果也更简洁高效。
内容的提问来源于stack exchange,提问作者Jess
相关产品推荐
相关产品推荐

