R语言按ID分组重编码聚类标签且不改变DataFrame行顺序
R按分组对聚类标签按首次出现顺序重编码(不改变原行顺序)
核心需求
对每个id分组下的聚类结果重编码,满足:
- 组内标签从1开始按值首次出现的顺序连续编号
- 全程不调整原数据框的行顺序
- 不同分组的编码独立计算,互不干扰
可直接运行的实现方案
1. dplyr 版本(最适合日常数据处理)
library(dplyr) reprex_result <- reprex %>% group_by(id) %>% mutate(what_iWant = match(cluster, unique(cluster))) %>% ungroup()
实现逻辑:按id分组后,unique(cluster)会严格保留组内cluster值的首次出现顺序返回去重序列,match()会返回每个原始cluster值在该序列中的位置,刚好就是从1开始的连续编号,运算全程不会改动原数据的行排列顺序。
运行输出和预期结果完全一致:
# A tibble: 8 × 4 id v1 cluster what_iWant <int> <int> <dbl> <int> 1 1 1 2 1 2 1 2 2 1 3 1 3 1 2 4 1 4 3 3 5 2 1 3 1 6 2 2 1 2 7 2 3 2 3 8 2 4 2 3
2. base R 版本(无第三方包依赖)
不需要加载任何扩展包,原生R即可实现:
reprex$what_iWant <- ave( reprex$cluster, reprex$id, FUN = function(x) match(x, unique(x)) )
3. data.table 版本(大数据量场景性能最优)
处理十万行以上的大规模数据集时,该版本运算速度显著高于其他方法:
library(data.table) setDT(reprex)[, what_iWant := match(cluster, unique(cluster)), by = id]
避坑提醒
不要使用as.integer(factor(cluster))这类写法:factor默认会按变量值的大小排序后再生成编码,不是按值的首次出现顺序编码,会得到不符合要求的结果。例如id=1组的原始cluster序列是2,2,1,3,factor排序后的值顺序是1,2,3,第一个出现的cluster=2会被编码为2,和预期结果不符。
内容的提问来源于stack exchange,提问作者Myriad
相关产品推荐
相关产品推荐

