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

按分组统计唯一值:用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实现需求,步骤如下:

  1. 标记每个学生的首次入学季度
  2. 按季度统计当季新增人数
  3. 计算累计唯一学生总数

完整代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 12:15:41