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

求类似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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:48:21