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
相关产品推荐
相关产品推荐

