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

R语言:基于连续事件类别分组生成唯一事件ID

在R中为连续相同事件组分配唯一ID

我手里有个R数据框,其中eventCat列是包含Drought、Dry、Normal、Wet、Storm五个水平的因子,示例数据长这样:

eventCat
Dry
Dry
Drought
Drought
Wet
Storm
Storm 
Normal 
Normal
Dry
Dry

现在需要给每一组连续相同的事件分配唯一ID,注意前后不同批次的相同事件(比如开头的Dry和结尾的Dry)要对应不同ID,最终要得到这样的结果:

eventCat          eventCatID
Dry               1
Dry               1
Drought           2
Drought           2
Wet               3
Storm             4
Storm             4
Normal            5
Normal            5
Dry               6
Dry               6

方法1:Base R 实现

无需额外包,直接用基础函数就能搞定:

# 先构造示例数据框
df <- data.frame(eventCat = factor(c("Dry", "Dry", "Drought", "Drought", "Wet", "Storm", "Storm", "Normal", "Normal", "Dry", "Dry")))

# 生成唯一ID
df$eventCatID <- cumsum(c(TRUE, df$eventCat[-1] != df$eventCat[-nrow(df)]))

原理:通过判断每行与前一行的事件是否不同生成逻辑向量,再用cumsum()累加,首次出现新事件时ID加1,连续相同事件保持同一ID。

方法2:dplyr 包实现

如果习惯用tidyverse工具链,用dplyr写起来更流畅:

library(dplyr)

df <- df %>%
  mutate(eventCatID = cumsum(eventCat != lag(eventCat, default = first(eventCat))))

或者用分组的方式实现:

df <- df %>%
  group_by(grp = cumsum(eventCat != lag(eventCat, default = first(eventCat)))) %>%
  mutate(eventCatID = cur_group_id()) %>%
  ungroup() %>%
  select(-grp)

方法3:data.table 包实现

处理大数据集时,data.table的效率更高,还有专门的函数:

library(data.table)

setDT(df)
df[, eventCatID := rleid(eventCat)]

rleid()是data.table内置的函数,专门用来生成连续相同值的唯一ID,一步到位。


内容的提问来源于stack exchange,提问作者Melanie Baker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:24:29