使用R为dataframe新增列统计同一公园事件前指定周数的报告数量
问题原因
原有代码的核心问题如下:
- 按
Park和Date分组导致每组仅包含单日数据,无法统计跨日期的历史报告数量 - 计算逻辑把当前日期的行也纳入了统计范围,导致本该返回0的首行错误返回1
- 使用
summarise会丢失原始数据的其他列,不符合保留原有结构新增列的需求
实现代码
只需要调整分组逻辑,按公园分组后逐行统计滑动窗口内的历史行数即可,以下代码仅依赖你已经加载的dplyr和lubridate包,且支持灵活调整统计周数:
library(lubridate) library(dplyr) library(purrr) # 要统计2、3、4周直接修改这个参数即可 stat_weeks <- 1 Reaction_per_park_per_day_4 <- Reaction_per_park_per_day_3 %>% # 按公园分组,仅统计同一公园内的历史数据 group_by(Park) %>% mutate(AC_1_before = map_dbl(Date, function(cur_date) { # 统计区间:[当前日期前推stat_weeks周,当前日期前1天],不包含当前行的事件 sum(Date >= cur_date - weeks(stat_weeks) & Date < cur_date) })) %>% ungroup()
如果你的数据量较大,可以使用slider包优化滑动计算效率:
# 首次使用先执行 install.packages("slider") library(slider) stat_weeks <- 1 Reaction_per_park_per_day_4 <- Reaction_per_park_per_day_3 %>% arrange(Park, Date) %>% group_by(Park) %>% mutate(AC_1_before = slide_sum( x = rep(1, n()), i = Date, before = weeks(stat_weeks), after = -1 # 排除当前日期的行 )) %>% ungroup()
逻辑说明
以上代码的统计逻辑完全匹配需求:
- 仅统计同一公园内的历史事件
- 窗口长度支持灵活调整为1/2/3/4周
- 不会统计当前行的事件,符合给出的预期输出结果
- 保留原始数据的所有列,仅新增目标列
AC_1_before
内容的提问来源于stack exchange,提问作者Gab_Laj
相关产品推荐
相关产品推荐

