如何在纵向数据时间重置时为同一研究对象分配新ID
纵向数据时间重置时的新ID分配方法
当同一研究对象的纵向数据中,时间序列出现重置(比如从4跳回2、从6跳回3),我们需要为每个连续递增的时间片段分配独立ID,以下是具体实现方案:
原示例数据
df <- data.frame(time=c(1,2,3,4,2,3,4,5,6,3,4), id=c(1,1,1,1,1,1,1,1,1,1,1)) df # time id # 1 1 1 # 2 2 1 # 3 3 1 # 4 4 1 # 5 2 1 # 6 3 1 # 7 4 1 # 8 5 1 # 9 6 1 # 10 3 1 # 11 4 1
核心思路
识别时间序列中当前时间小于前一个时间的节点,这些节点就是新时间片段的起始点;通过累计这些起始点的数量,自动生成对应的新ID。
代码实现
方法1:用dplyr包(简洁直观)
library(dplyr) df_new <- df %>% mutate( # 标记新片段起始行:第一行,或当前时间小于前一行时间 new_segment = row_number() == 1 | time < lag(time), # 累加标记生成新ID id = cumsum(new_segment) ) %>% select(-new_segment) # 移除中间辅助列 df_new # time id # 1 1 1 # 2 2 1 # 3 3 1 # 4 4 1 # 5 2 2 # 6 3 2 # 7 4 2 # 8 5 2 # 9 6 2 # 10 3 3 # 11 4 3
方法2:Base R实现(无需额外包)
# 标记新片段起始点 df$new_segment <- c(TRUE, df$time[-1] < df$time[-nrow(df)]) # 累加标记生成新ID df$id <- cumsum(df$new_segment) # 保留需要的列 df <- df[, c("time", "id")] df # time id # 1 1 1 # 2 2 1 # 3 3 1 # 4 4 1 # 5 2 2 # 6 3 2 # 7 4 2 # 8 5 2 # 9 6 2 # 10 3 3 # 11 4 3
逻辑解释
new_segment列用来标记每个新时间片段的开始:第一行默认是新片段起点,后续只要当前时间比前一行小,就判定为新片段开始。cumsum(new_segment)对标记进行累加,每遇到一个TRUE就加1,最终生成的数值就是每个时间片段对应的独立ID。
内容的提问来源于stack exchange,提问作者cliu
相关产品推荐
相关产品推荐

