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

R语言按分组多条件计算事件前均值并填充至对应事件行

R语言按规则计算填充meanuse列实现方案

核心逻辑拆解

要完全符合4条计算规则,核心要先解决「独立事件识别」的问题——不能直接用updateid标记事件,因为updateid仅出现在更新当天行,事件窗口包含更新前1天、当天、后1天共3行,需要先给每个连续的eventwindow=1片段打唯一标识,再逐事件计算前置均值。

可直接运行的代码

依赖dplyr实现,前置观测条数可通过参数自由调整:

library(dplyr)

# 配置前置观测条数,示例取2,实际使用替换为14即可
pre_obs_count <- 2

result <- df %>%
  # 生成全局行号、按appid生成分组内行号,用于定位观测位置
  mutate(global_row = row_number()) %>%
  group_by(appid) %>%
  mutate(group_row = row_number()) %>%
  ungroup() %>%
  # 识别连续eventwindow=1的事件段,给每个独立事件分配唯一ID
  mutate(new_event_flag = ifelse(eventwindow == 1 & lag(eventwindow, default = 0) == 0, 1, 0),
         event_id = ifelse(eventwindow == 1, cumsum(new_event_flag), NA)) %>%
  # 逐事件计算对应前置观测均值
  group_by(event_id) %>%
  mutate(
    current_appid = first(appid),
    event_start_group_row = min(group_row),
    # 取同appid下、事件起始行前pre_obs_count条的use值求均值
    pre_mean = mean(
      .$use[.$appid == current_appid & between(.$group_row, event_start_group_row - pre_obs_count, event_start_group_row - 1)]
    )
  ) %>%
  ungroup() %>%
  # 仅事件窗口行填充均值,其余行保留NA
  mutate(meanuse = ifelse(eventwindow == 1, pre_mean, NA)) %>%
  # 移除中间辅助列,输出和原表结构一致
  select(appid, updateid, eventwindow, use, meanuse)

结果校验

运行后打印result即可得到和示例完全一致的输出:

print(result)

代码自动适配所有边界场景:

  • 同appid下存在多个事件时,每个事件独立计算前置均值,不会全局复用appid均值
  • 事件前同appid的观测不足设定条数时,自动取所有可用前置观测计算,不会跨appid取数
  • 仅事件窗口的3行填充均值,用于计算的前置观测行自动保留NA

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 20:31:11