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

使用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. 窗口长度支持灵活调整为1/2/3/4周
  3. 不会统计当前行的事件,符合给出的预期输出结果
  4. 保留原始数据的所有列,仅新增目标列AC_1_before

内容的提问来源于stack exchange,提问作者Gab_Laj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:45:05