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)
代码说明
- 标记死亡事件:直接通过
ifelse识别status == "died"的行,设置Censor = 1 - 识别连续Lost组:通过
cumsum和diff生成连续相同状态的分组ID,区分不同的连续段 - 标记连续Lost事件:按分组统计长度,对长度≥3的Lost组,标记其第一行为1
- 合并结果:用
pmax合并两种规则的标记结果,确保符合任一条件的行都被标记为1 - 清理临时列:移除过程中生成的辅助列,保持数据框整洁
内容的提问来源于stack exchange,提问作者Yebelay Berehan
相关产品推荐
相关产品推荐

