R语言dplyr实现条件累加和:排除当前日期所有事件的统计
R实现排除当日的历史参会次数累加
实现思路
- 先将时间戳转换为日期维度,按「人员+日期」分组统计每个人每日的参会总次数
- 按人员分组,计算到「上一日为止」的累计参会次数
- 将计算得到的历史累计值匹配回原数据集的每一行即可
完整实现代码
library(dplyr) library(lubridate) # 若不想额外加载包,可将下文as_date替换为base包的as.Date df_result <- df %>% # 提取活动日期维度 mutate(event_date = as_date(date_time)) %>% # 按人员+日期分组,统计每人每日参会总次数 group_by(person, event_date) %>% summarise(daily_attend = sum(did_attend), .groups = "drop_last") %>% # 按人员分组,滞后一天计算累计参会次数,自动排除当日所有记录 mutate(events_attended_desired = lag(cumsum(daily_attend), default = 0)) %>% ungroup() %>% # 将计算结果匹配回原数据的每一行 right_join(df %>% mutate(event_date = as_date(date_time)), by = c("person", "event_date")) %>% # 调整列顺序和原数据对齐 select(all_of(colnames(df)), events_attended_desired)
逻辑说明
该方法避开了在cumsum内嵌套条件判断的复杂逻辑,通过先聚合再匹配的方式适配每日活动数量不固定的场景:
- 先按日期聚合后,每个人每个日期仅对应一条统计记录,此时用
lag()偏移累计值就可以实现「所有当日记录都不计入」的需求 - 运行得到的
events_attended_desired列和你给出的预期结果完全一致
内容的提问来源于stack exchange,提问作者neander
相关产品推荐
相关产品推荐

