在R中基于自定义条件创建滞后变量及相关统计计算
基于随机事件时点的变量滞后与均值计算方案
先拿示例数据集来演示,生成代码如下:
library(tidyverse) set.seed(123) rows <- sample(1:nrow(mtcars),4,) df <- mtcars %>% mutate( event_id=row_number() ,random_event=if_else(event_id %in% rows,1,0) )
需求1:给事件行填上次事件的mpg值,非事件行填0
因为事件间隔不固定,直接用dplyr::lag()会给所有行生成滞后值,不符合要求。我们可以先把所有事件行单独提取出来,给这些行生成对应上一次事件的mpg值,再合并回原数据集,最后把非事件行的空缺值替换成0:
# 提取所有事件行,生成上一次事件的mpg event_rows <- df %>% filter(random_event == 1) %>% mutate(prev_event_mpg = lag(mpg)) # 合并回原表,非事件行填0 df <- df %>% left_join(event_rows %>% select(event_id, prev_event_mpg), by = "event_id") %>% mutate(prev_event_mpg = replace_na(prev_event_mpg, 0))
需求2:事件行计算最近两次事件mpg的平均值
同样先处理事件行,这里提供两种实现方式,按需选择:
方法1:用slider包(灵活扩展,支持最近3次的情况)
# 未安装slider的话先执行:install.packages("slider") library(slider) event_rows <- event_rows %>% # .before=1表示取当前行和前1行(最近两次);若要计算最近3次,改成.before=2即可 mutate(last_two_mpg_avg = slide_dbl(mpg, mean, .before = 1, .complete = TRUE)) # 合并回原表,非事件行填0 df <- df %>% left_join(event_rows %>% select(event_id, last_two_mpg_avg), by = "event_id") %>% mutate(last_two_mpg_avg = replace_na(last_two_mpg_avg, 0))
方法2:用dplyr手动计算(无需额外安装包)
event_rows <- event_rows %>% mutate(last_two_mpg_avg = (mpg + lag(mpg))/2) # 合并回原表,非事件行填0 df <- df %>% left_join(event_rows %>% select(event_id, last_two_mpg_avg), by = "event_id") %>% mutate(last_two_mpg_avg = replace_na(last_two_mpg_avg, 0))
完整代码&结果查看
把所有步骤整合起来,运行后可以查看事件行的结果:
library(tidyverse) library(slider) set.seed(123) rows <- sample(1:nrow(mtcars),4,) df <- mtcars %>% mutate( event_id=row_number() ,random_event=if_else(event_id %in% rows,1,0) ) # 处理需求1 event_rows <- df %>% filter(random_event == 1) %>% mutate(prev_event_mpg = lag(mpg)) df <- df %>% left_join(event_rows %>% select(event_id, prev_event_mpg), by = "event_id") %>% mutate(prev_event_mpg = replace_na(prev_event_mpg, 0)) # 处理需求2(用slider实现) event_rows <- event_rows %>% mutate(last_two_mpg_avg = slide_dbl(mpg, mean, .before = 1, .complete = TRUE)) df <- df %>% left_join(event_rows %>% select(event_id, last_two_mpg_avg), by = "event_id") %>% mutate(last_two_mpg_avg = replace_na(last_two_mpg_avg, 0)) # 查看事件行的结果 df %>% filter(random_event == 1) %>% select(event_id, mpg, prev_event_mpg, last_two_mpg_avg)
运行后,事件行的prev_event_mpg列就是上一次事件对应的mpg值(第一次事件因无前置事件,填充为0);last_two_mpg_avg列是最近两次事件的mpg平均值(第一次事件仅自身数据,这里替换为0,若需保留NA可删除replace_na步骤)。
内容的提问来源于stack exchange,提问作者alejandro_hagan
相关产品推荐
相关产品推荐

