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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 18:02:42