如何在data.table中每次value值变化时生成唯一组ID?
解决data.table中连续重复值的组ID生成问题
嘿,刚好这个需求我之前也遇到过,用data.table自带的rleid()函数就能轻松搞定!它专门用来给连续的相同值生成唯一组ID,完全匹配你要的“每次value变化就生成新ID”的要求。
具体步骤:
首先先重现你的数据集:
library(data.table) set.seed(666) foo = data.table(id = 1:20, value = sample(c(1, -1), 20, replace = T))
然后直接添加组ID列:
foo[, group_id := rleid(value)]
运行后的结果:
id value group_id 1: 1 -1 1 2: 2 1 2 3: 3 -1 3 4: 4 1 4 5: 5 1 4 6: 6 -1 5 7: 7 -1 5 8: 8 1 6 9: 9 1 6 10: 10 1 6 11: 11 -1 7 12: 12 1 8 13: 13 1 8 14: 14 1 8 15: 15 1 8 16: 16 -1 9 17: 17 1 10 18: 18 -1 11 19: 19 1 12 20: 20 1 12
简单解释:
rleid()的逻辑很直观:它会遍历value列,每当遇到和前一行不同的值时,就把组ID加1;如果值和前一行相同,就保持当前ID。这个函数是data.table原生优化的,处理几十万甚至上百万行的数据集都超快,比手动写循环或者其他分组方法效率高太多。
如果需要自定义组ID的格式,比如从0开始计数,或者改成字符串前缀,只需要稍微调整:
- 从0开始:
foo[, group_id := rleid(value) - 1] - 带字符串前缀:
foo[, group_id := paste0("group_", rleid(value))]
内容的提问来源于stack exchange,提问作者Felipe Alvarenga
相关产品推荐
相关产品推荐

