按分组统计唯一值:用R语言dplyr实现新增与总注册人数统计
按季度统计新增及累计学生人数
原始数据集与目标需求
原始数据集DATA记录了各季度的学生参与情况:
DATA = data.frame("TRIMESTER" = c(1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3), "STUDENT" = c(1,2,3,4,5,6,7,1,2,3,5,9,10,11,3,7,10,6,12,15,17,16,21))
需要生成WANT数据集,包含三列:
TRIMESTER:季度NEW_ENROLL:当季新增的学生人数(首次在该季度出现的学生)TOTAL_ENROLL:截至该季度的累计唯一学生总数
目标数据集示例:
WANT = data.frame("TRIMESTER" = c(1,2,3), "NEW_ENROLL" = c(7,3,5), "TOTAL_ENROLL" = c(7,10,15))
现有尝试
目前仅能统计每个季度的学生参与人数,代码如下:
library(dplyr) DATA %>% group_by(TRIMESTER) %>% count()
解决方案
使用dplyr实现需求,步骤如下:
- 标记每个学生的首次入学季度
- 按季度统计当季新增人数
- 计算累计唯一学生总数
完整代码:
library(dplyr) # 提取每个学生的首次入学季度 student_first_trim <- DATA %>% group_by(STUDENT) %>% summarise(first_trim = min(TRIMESTER), .groups = "drop") # 统计新增及累计人数 WANT <- DATA %>% left_join(student_first_trim, by = "STUDENT") %>% group_by(TRIMESTER) %>% # 统计当季新增:筛选首次入学季度等于当前季度的学生,去重计数 summarise(NEW_ENROLL = n_distinct(STUDENT[first_trim == TRIMESTER]), .groups = "drop") %>% # 累加新增人数得到累计总人数 mutate(TOTAL_ENROLL = cumsum(NEW_ENROLL))
代码说明
student_first_trim:通过分组每个学生,取最小的季度值,得到每个学生首次出现的季度。- 合并后按季度分组,用
n_distinct统计当季新增学生(避免同一学生同季度多次出现的重复计数)。 cumsum(NEW_ENROLL)直接累加各季度新增人数,得到截至当前季度的累计唯一学生总数,结果与目标数据集完全匹配。
内容的提问来源于stack exchange,提问作者bvowe
相关产品推荐
相关产品推荐

