对含重复元素的R语言向量进行连续重编号处理
问题:修复R向量中的数字跳跃,保留重复次数
原始R向量avec数据如下:
avec <- c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 31L, 31L, 31L, 31L, 31L, 31L, 31L, 31L, 31L, 31L, 31L, 31L, 44L, 44L, 44L, 47L, 47L, 47L, 47L, 51L, 51L, 51L, 51L, 51L, 51L, 51L, 51L, 51L, 51L, 51L, 51L, 51L, 51L, 51L, 52L, 52L, 52L, 52L, 52L, 52L, 52L)
查看向量的重复情况:
table(avec) # 输出: # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 44 47 51 52 # 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 13 3 4 15 7
该向量存在数字跳跃(如缺失32至43、45至46等),需要将其修改为连续无跳跃的序列,同时保留每个值的重复次数,期望输出如下:
avec <- c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 31L, 31L, 31L, 31L, 31L, 31L, 31L, 31L, 31L, 31L, 31L, 31L, 32L, 32L, 32L, 33L, 33L, 33L, 33L, 34L, 34L, 34L, 34L, 34L, 34L, 34L, 34L, 34L, 34L, 34L, 34L, 34L, 34L, 34L, 35L, 35L, 35L, 35L, 35L, 35L, 35L)
最简解决方案
利用因子的特性,将原始向量的唯一值映射为连续整数:
# 提取排序后的唯一值 unique_sorted <- sort(unique(avec)) # 将向量转换为因子,再转为整数类型 avec_fixed <- as.integer(factor(avec, levels = unique_sorted))
说明
sort(unique(avec))获取向量中所有唯一值并按升序排列,确保映射的连续性。factor(avec, levels = unique_sorted)将原始向量转换为因子,每个原始值对应排序后唯一值序列中的位置。as.integer()将因子转换为整数,得到连续无跳跃的序列,同时完全保留原始值的重复次数。
验证修复后的向量:
table(avec_fixed) # 输出: # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 # 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 13 3 4 15 7
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

