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

如何按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,否则FALSE
  • as.integer():将逻辑值转换为0/1,匹配Dummy列的数值格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:41:54