如何有条件地将递增的后缀附加到 R 中的向量

How to conditionally append incremented suffix to vector in R

我在 R 中有一个具有重复值的字符向量:

vec <- c('22','22','22','45','45','45','56','67','67','67','89','90')

我想将 _1、_2、_3 附加到向量中的相似值以获得如下向量:

vec <- c('22_1','22_2','22_3','45_1','45_2','45_3','56'_1,'67_1','67_2' ...

我的问题是如何有条件地递增(“56”是单数,不需要附加值)。我尝试编写一个循环并将出现次数存储在列表中,但它非常冗长,我怀疑在 apply 系列中有更简单的方法。

我们可以使用 ave 并得到按 'vec' 分组的序列,然后 paste 它与原始向量。

 res <- paste(vec, ave(vec, vec, FUN=seq_along), sep="_")

如果我们需要从频率为 1 的元素中替换 _1,请使用 table 获取频率,子集与 names 匹配的元素'table' 与 'res' 的频率为 1 并删除 _ 后跟零个或多个字符 sub.

 tbl <- table(vec)
 names(tbl)[tbl==1]
 i1 <- vec %in% names(tbl)[tbl==1]
 res[i1] <-  sub('_.*', '', res[i1])
 res
 #[1] "22_1" "22_2" "22_3" "45_1" "45_2" "45_3" "56"   "67_1" "67_2" "67_3"
 #[11] "89"   "90"  

或者我们可以只使用 make.unique

 make.unique(vec, sep="_")
 #[1] "22"   "22_1" "22_2" "45"   "45_1" "45_2" "56"   "67"   "67_1" "67_2"
 #[11] "89"   "90"