【问题标题】:How to conditionally append incremented suffix to vector in R如何有条件地将递增的后缀附加到 R 中的向量
【发布时间】:2016-05-04 09:02:06
【问题描述】:

我在 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 系列中有更简单的方法。

【问题讨论】:

    标签: r vector append increment


    【解决方案1】:

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

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

    如果我们需要替换频率为 1 的元素中的 _1,请使用 table 获取频率,将与频率为 1 的“表”的 names 匹配的元素子集为'res' 并删除 _ 后跟零个或多个带有 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"  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      • 2014-04-09
      • 2020-03-03
      • 2015-05-13
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      相关资源
      最近更新 更多