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

R语言基于过往记录赋值虚拟变量且覆盖同一年份场景的实现问题

R实现同组同年/上一年事件标记的解决方案

场景说明

需要按唯一标识(如用户ID、主体ID)分组后,对每行记录判断:当前年或者前一年同组内出现过目标事件(即dummy列值为1),符合条件则dummycount赋值为1,否则为0。

实现代码

方法1:tidyverse(dplyr)实现

可读性高,适合常规数据量场景:

library(dplyr)

# 示例数据,可替换为你的实际数据集
df <- tibble(
  id = rep(c("A", "B"), each = 5),
  year = rep(2016:2020, 2),
  dummy = c(0,1,0,0,1, 0,0,1,0,0)
)

df <- df %>%
  group_by(id) %>%
  arrange(year, .by_group = TRUE) %>%
  # 只要当前年或上一年有事件就标记为1
  mutate(dummycount = as.integer(dummy == 1 | lag(dummy, default = 0) == 1)) %>%
  ungroup()

代码说明:

  • 先按分组ID和年份排序,保证时间序列顺序正确
  • lag(dummy, default = 0)取同组上一年的dummy值,首行无上年数据时默认赋值为0避免出现NA
  • 逻辑判断只要当前dummy为1或者上一年dummy为1,就返回1,否则为0

方法2:data.table实现

运行效率更高,适合百万级以上的大数据量场景:

library(data.table)

setDT(df)
setorder(df, id, year)
df[, dummycount := as.integer(dummy == 1 | shift(dummy, fill = 0) == 1), by = id]

结果验证

以上述示例数据为例,输出结果符合预期:

idyeardummydummycount
A201600
A201711
A201801
A201900
A202011
B201600
B201700
B201811
B201901
B202000

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:24:01