如何按ID分组创建触发型Dummy变量:首次为1后后续全置1
需求:按组将首次出现Dummy=1后的所有行设为1
我需要处理数据,按ID分组后,只要组内某一行的Dummy值为1,该行之后(年份升序的后续行)的所有Dummy都要设为1。
示例数据
原始数据df1:
df1 <- data.frame( ID = rep(seq(1:3), each = 4), year = rep(c(2014, 2015, 2016, 2017), 3), value = runif(12, min = 0, max = 25), Dummy = c(0,0,1,0 ,0,1,0,1, 1,0,0,0) )
期望转换后的df2:
df2 <- data.frame( ID = rep(seq(1:3), each = 4), # 注:原代码中ID写法有误,修正为与df1一致的分组逻辑 year = rep(c(2014, 2015, 2016, 2017), 3), value = runif(12, min = 0, max = 25), Dummy = c(0,0,1,1 ,0,1,1,1, 1,1,1,1) )
我尝试的代码(未成功)
df2 <- df1 %>% group_by(ID) %>% arrange(ID , year) %>% mutate(treated = case_when( Dummy == 1 ~ 1, lag(Dummy, n= unique(n()), default = 0) == 1 ~ 1 ))
解决方案
使用dplyr的cumany()函数可以简洁实现需求,它会从前往后累积判断是否出现过Dummy=1,后续所有行都会标记为TRUE,转成整数即为1:
library(dplyr) df2 <- df1 %>% group_by(ID) %>% arrange(year, .by_group = TRUE) %>% # 确保组内按年份升序排列 mutate(Dummy = as.integer(cumany(Dummy == 1))) %>% ungroup()
代码说明
cumany(Dummy == 1):按组内顺序,只要之前出现过Dummy=1,当前及后续行返回TRUE,否则FALSEas.integer():将逻辑值转换为0/1,匹配Dummy列的数值格式
内容的提问来源于stack exchange,提问作者Sulz
相关产品推荐
相关产品推荐

