如何按班级计算各年级占比并统计三年级占比的均值与标准差
解决方法
方法一:补全缺失的因子水平(长格式输出)
分组统计时部分班级会缺失trs1jgs的某个因子水平(比如只有3年级学生时,4年级的行会缺失),可以用tidyr::complete()函数补全这些缺失组合,再计算占比:
library(tidyverse) # 生成包含所有年级占比的完整表格 Grade <- B %>% group_by(sg_id, trs1jgs) %>% summarise(n = n(), .groups = "drop_last") %>% # 仅保留班级分组,方便计算班级总人数 complete(trs1jgs, fill = list(n = 0)) %>% # 补全当前班级缺失的年级,对应人数填0 mutate(freq = n / sum(n)) %>% # 计算各年级学生占比 ungroup()
这段代码会确保每个班级都有3年级和4年级的行,哪怕对应年级没有学生(占比为0)。
方法二:直接计算各年级占比(宽格式输出,更高效)
如果目标是快速得到每个班级的年级占比,同时方便提取3年级占比的向量,可以跳过统计人数的步骤,直接在班级分组内计算占比:
# 生成宽格式占比表格,每个班级对应一行 Grade_wide <- B %>% group_by(sg_id) %>% summarise( grade3_freq = mean(trs1jgs == 3), # 逻辑值转数值后取均值,即为3年级学生占比 grade4_freq = mean(trs1jgs == 4), .groups = "drop" )
提取3年级占比并计算均值、标准差
无论用哪种方法,都可以轻松提取3年级占比的向量并计算统计量:
# 从长格式表格提取 grade3_freq_long <- Grade %>% filter(trs1jgs == 3) %>% pull(freq) # 从宽格式表格提取 grade3_freq_wide <- Grade_wide$grade3_freq # 计算均值和标准差 mean(grade3_freq_wide) sd(grade3_freq_wide)
内容的提问来源于stack exchange,提问作者Katharina
相关产品推荐
相关产品推荐

