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

R语言数据处理:生成Censor列标记连续Lost或died事件

R语言实现数据框新增Censor列

需求说明

  • 为数据框dfram新增一列Censor,赋值规则如下:
    • 当status列出现至少3次连续的Lost时,在这组连续Lost的第一行标记Censor = 1
    • 当status的值为died时,在该行标记Censor = 1
    • 其余所有情况Censor = 0

原始数据定义

dfram <-  data.frame(id=c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4, 5,5,6,6,6,6), 
                     status=c("Alive","Lost", "Lost","Restart","Lost","Alive", "Lost","Lost","Lost","Dropped", "Alive","Alive","Lost","Lost","Restart","Alive","Lost","Lost","Alive","died","Alive","Lost","Lost","Lost"))

原始数据示例

id  status
1   1   Alive
2   1    Lost
3   1    Lost
4   1 Restart
5   1    Lost 
6   2   Alive
7   2    Lost   # 事件:出现3次连续Lost
8   2    Lost
9   2    Lost
10  2 Dropped
11  3   Alive
12  3   Alive
13  3    Lost
14  3    Lost
15  3 Restart
16  4   Alive
17  4    Lost
18  4    Lost
19  5   Alive
20  5    died  # 事件:死亡也被视为事件
21  6   Alive
22  6    Lost  # 事件
23  6    Lost
24  6    Lost

预期输出结果

id  status Censor
1   1   Alive      0
2   1    Lost      0
3   1    Lost      0
4   1 Restart      0
5   1    Lost      0
6   2   Alive      0
7   2    Lost      1
8   2    Lost      0
9   2    Lost      0
10  2 Dropped      0
11  3   Alive      0
12  3   Alive      0
13  3    Lost      0
14  3    Lost      0
15  3 Restart      0
16  4   Alive      0
17  4    Lost      0
18  4    Lost      0
19  5   Alive      0
20  5    died      1
21  6   Alive      0
22  6    Lost      1
23  6    Lost      0
24  6    Lost      0

(注:原预期输出存在行号与数据不匹配的问题,已修正为与原始数据对应格式)

实现代码

library(dplyr)

# 处理数据
dfram <- dfram %>%
  # 先标记died对应的Censor值
  mutate(Censor = ifelse(status == "died", 1, 0)) %>%
  # 识别连续的Lost分组
  mutate(
    is_lost = status == "Lost",
    # 生成连续组的唯一ID:状态变化时组ID递增
    group_id = cumsum(c(TRUE, diff(is_lost) != 0))
  ) %>%
  # 按分组统计连续长度,标记符合条件的行
  group_by(group_id) %>%
  mutate(
    group_length = n(),
    # 标记连续3个及以上Lost的第一行
    censor_lost = ifelse(is_lost & group_length >= 3 & row_number() == 1, 1, 0)
  ) %>%
  ungroup() %>%
  # 合并两种标记规则的结果
  mutate(Censor = pmax(Censor, censor_lost)) %>%
  # 清理临时辅助列
  select(-is_lost, -group_id, -group_length, -censor_lost)

# 输出结果
print(dfram)

代码说明

  1. 标记死亡事件:直接通过ifelse识别status == "died"的行,设置Censor = 1
  2. 识别连续Lost组:通过cumsum和diff生成连续相同状态的分组ID,区分不同的连续段
  3. 标记连续Lost事件:按分组统计长度,对长度≥3的Lost组,标记其第一行为1
  4. 合并结果:用pmax合并两种规则的标记结果,确保符合任一条件的行都被标记为1
  5. 清理临时列:移除过程中生成的辅助列,保持数据框整洁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:09:45