使用dplyr分组判断课程最新注册者是否为新用户
用dplyr判断每门课程最新注册者是否为新用户
需求说明
现有记录不同人员在不同时间段注册4门课程的数据集,需要通过dplyr分组处理,判断每门课程的最新注册者是否为该课程的新用户(此前未注册过该课程)。
示例数据集
df <- data.frame(course=c(1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4), name=c("jessica","alex","rose","sam","paul","steve","sarah","julia","paul","alex","helen","adam", "jessica","moe","rose","dave"), date=as.Date(c("2023-02-10","2022-10-10","2022-10-10","2022-10-10","2022-11-10","2023-02-10","2022-11-10", "2022-11-10","2022-12-10","2022-12-10","2022-12-10","2022-12-10","2022-10-10", "2022-11-10","2023-02-10","2023-02-10")) )
按课程和日期排序后的数据:
df %>% arrange(course, date)
输出:
course name date 1 1 jessica 2022-10-10 2 1 paul 2022-11-10 3 1 paul 2022-12-10 4 1 jessica 2023-02-10 5 2 alex 2022-10-10 6 2 moe 2022-11-10 7 2 alex 2022-12-10 8 2 steve 2023-02-10 9 3 rose 2022-10-10 10 3 sarah 2022-11-10 11 3 helen 2022-12-10 12 3 rose 2023-02-10 13 4 sam 2022-10-10 14 4 julia 2022-11-10 15 4 adam 2022-12-10 16 4 dave 2023-02-10
解决方法
使用dplyr的分组、排序和统计功能,步骤如下:
- 按课程分组,对每组内的记录按日期排序
- 获取每组最新注册的用户(即排序后的最后一条记录的用户)
- 统计该用户在当前课程组内的注册次数,若仅为1次则是新用户(标记为1),否则不是(标记为0)
- 去重并整理结果
完整代码
library(dplyr) # 处理逻辑 result <- df %>% group_by(course) %>% arrange(date) %>% # 获取当前课程的最新注册用户 mutate(latest_name = last(name)) %>% # 判断该用户是否仅注册过一次 mutate(new_registered = as.integer(sum(name == latest_name) == 1)) %>% # 保留每个课程的唯一结果 distinct(course, new_registered) %>% ungroup() # 输出结果 print(result)
输出结果
# A tibble: 4 × 2 course new_registered <dbl> <int> 1 1 0 2 2 1 3 3 0 4 4 1
该结果完全符合预期:课程1和3的最新注册者此前已注册过(标记0),课程2和4的最新注册者是新用户(标记1)。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

