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

如何在纵向数据时间重置时为同一研究对象分配新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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:05:20