如何有条件地将递增的后缀附加到 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"
我在 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"