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]
结果验证
以上述示例数据为例,输出结果符合预期:
| id | year | dummy | dummycount |
|---|---|---|---|
| A | 2016 | 0 | 0 |
| A | 2017 | 1 | 1 |
| A | 2018 | 0 | 1 |
| A | 2019 | 0 | 0 |
| A | 2020 | 1 | 1 |
| B | 2016 | 0 | 0 |
| B | 2017 | 0 | 0 |
| B | 2018 | 1 | 1 |
| B | 2019 | 0 | 1 |
| B | 2020 | 0 | 0 |
内容的提问来源于stack exchange,提问作者Lars
相关产品推荐
相关产品推荐

