如何在R语言中根据字符串向量生成递增数值向量?
问题
给定如下字符串向量:
strings_input <- c("a", "a", "b", "b", "b", "c", "c", "a", "b", "b")
需要将其转换为按连续相同元素块递增编号的数值向量,预期结果为:
expected_output <- c(1, 1, 2, 2, 2, 3, 3, 4, 5, 5)
解决方案
基础R实现(无需额外包)
利用R内置的rle()函数(游程编码)就能快速实现:
# 对输入向量做游程编码 run_info <- rle(strings_input) # 生成每个连续块的编号,并按块长度重复 result <- rep(seq_along(run_info$values), run_info$lengths) # 查看结果 result #> [1] 1 1 2 2 2 3 3 4 5 5
原理说明:
rle()会返回包含两个元素的列表:values是连续重复的唯一元素(此处为c("a", "b", "c", "a", "b")),lengths是每个元素连续出现的次数(此处为c(2, 3, 2, 1, 2))。seq_along(run_info$values)为每个连续块生成从1开始的递增编号,再通过rep()按块的长度重复对应编号,最终得到目标向量。
简洁实现(用data.table包)
如果习惯用data.table,它的rleid()函数可以一步到位:
library(data.table) result <- rleid(strings_input)
这个函数专门用于生成连续重复组的ID,输出结果和基础方法完全一致。
内容的提问来源于stack exchange,提问作者Alvaro Morales
相关产品推荐
相关产品推荐

