求类似rleid但遇NA重置计数器的R语言实现(支持data.table)
用data.table实现符合要求的计数器
直接看实现代码,逻辑都在注释里:
library(data.table) # 构造示例数据 dt <- data.table(months = c(1, 8, 1, 1, 1, NA, NA, 2, 6, NA)) # 1. 按NA分割连续非NA区块,NA对应的组设为NA dt[, group := rleid(is.na(months))] dt[is.na(months), group := NA] # 2. 每个非NA区块内,对不同数值首次出现计数,重复值沿用前值 dt[, months_counter := { # 给区块内每个唯一数值分配首次出现的顺序号 val_order <- match(months, unique(months)) # 累加首次出现的标记,得到计数器 cumsum(!duplicated(val_order)) }, by = group] # 3. 把NA行的计数器设为NA dt[is.na(months), months_counter := NA] # 查看结果 print(dt)
运行后months_counter列就是你要的结果:1, 2, 3, 3, 3, NA, NA, 1, 2, NA
关键逻辑拆解
- 用
rleid(is.na(months))把数据切成被NA分隔的连续非NA段,NA段的组ID设为NA,不参与后续计算 - 在每个非NA段里,
match(months, unique(months))能给每个新出现的数值分配递增的序号,再用cumsum(!duplicated(...))实现“首次出现计数+1,重复值保持不变”的效果 - 最后把NA行的计数器重置为NA,完全符合需求
内容的提问来源于stack exchange,提问作者Eugene Baraka
相关产品推荐
相关产品推荐

