在R data.table中为特定行索引应用递增数值
嘿,我来帮你搞定在R data.table里给特定行添加递增数值的问题~先把你提供的时序数据整理成清晰的表格,方便我们分析:
| Time | State | Event |
|---|---|---|
| 01 | 0 | |
| 02 | 0 | |
| 03 | 0 | |
| 04 | 2 | A_start |
| 05 | 2 | |
| 06 | 2 | |
| 07 | 2 | |
| 08 | 2 | |
| 09 | 1 | A_end |
| 10 | 1 | |
| 11 | 1 | |
| 12 | 1 | |
| 13 | 1 | |
| 14 | 2 | B_start |
| 15 | 2 | |
| 16 | 2 | |
| 17 | 2 | |
| 18 | 2 | |
| 19 | 0 | B_end |
| 20 | 0 | |
| 21 | 0 | |
| 22 | 0 | |
| 23 | 0 | |
| 24 | 2 | A_start |
| 25 | 2 | |
| 26 | 2 | |
| 27 | 2 | |
| 28 | 2 | |
| 29 | 2 | |
| 30 | 2 | |
| 31 | 1 | A_end |
| 32 | 1 | |
| 33 | 1 | |
| 34 | 1 | |
| 35 | 1 | |
| 36 | 1 | |
| 37 | 2 | B_start |
| 38 | 2 | |
| 39 | 2 | |
| 40 | 2 |
从数据来看,你应该是想给重复出现的事件周期或者特定状态段添加递增标识,下面给你几个常见场景的解决方案:
场景1:给每个完整事件周期(A/B流程)加递增批次号
如果要给每一组A_start→A_end、B_start→B_end的完整周期分配递增的批次号(比如第一个A周期是1,第一个B是2,第二个A是3,以此类推),可以通过识别_start事件来触发计数递增,代码如下:
library(data.table) # 先把你的数据转成data.table结构 dt <- data.table( Time = sprintf("%02d", 1:40), State = c(0,0,0,2,2,2,2,2,1,1,1,1,1,2,2,2,2,2,0,0,0,0,0,2,2,2,2,2,2,2,1,1,1,1,1,1,2,2,2,2), Event = c(rep("",3), "A_start", rep("",4), "A_end", rep("",5), "B_start", rep("",4), "B_end", rep("",5), "A_start", rep("",6), "A_end", rep("",6), "B_start", rep("",3)) ) # 添加批次号:每出现一个A_start或B_start,批次号+1 dt[, batch := cumsum(Event %in% c("A_start", "B_start"))]
运行后,每个事件周期内的所有行都会带上对应的递增批次号,非常方便后续分组分析。
场景2:仅给标记了Event的行加递增序号
如果只想给A_start、A_end这类有事件标记的行分配递增ID,其他行留空或设为NA,可以这样写:
# 给非空Event的行生成递增序号,其余行设为NA dt[, event_id := ifelse(Event != "", seq_len(sum(Event != "")), NA)]
要是想让A类和B类事件各自独立递增(比如A的start/end从1开始计数,B的也从1开始),可以按事件前缀分组处理:
# 提取事件前缀(A/B),再按前缀分组生成递增ID dt[, event_type := substr(Event, 1, 1)] dt[, event_id := ifelse(Event != "", seq_len(.N), NA), by = event_type]
场景3:按连续State段加递增分组ID
如果你的需求是给每一段连续相同的State(比如连续的0、连续的2、连续的1)分配唯一递增的ID,data.table的rleid()函数是绝佳选择,完美适配你说的“循环可重复任意数量的0、1等状态”的情况:
# 给连续相同的State生成递增分组ID dt[, state_group := rleid(State)]
这个state_group会自动识别连续状态段,每切换一次State,ID就自动+1,用起来超省心~
你可以根据实际需求选对应的方案,如果有更具体的规则(比如递增的触发条件、数值应用范围),随时调整代码细节就行。
内容的提问来源于stack exchange,提问作者mixedbag99
相关产品推荐
相关产品推荐

