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
相关产品推荐
相关产品推荐

