首页 > 解决方案 > 仅当项目在 R 中出现多次时才添加索引

问题描述

输入:

x <- list("&a", NULL, "&b", "&a", "", "&c", "&c", "&a", list())

期望的输出:

如果项目出现多次并且项目的长度不是 0、NULL 或空字符串,则添加索引

list("&a(1)", NULL, "&b", "&a(2)", "", "&c(1)", "&c(2)", "&a(3)", list())

我尝试了什么:

它可以工作,但肯定看起来不优雅/高效。

x <- list("&a", NULL, "&b", "&a", "", "&c", "&c", "&a", list())
tbl <- table(unlist(x))

for(name in names(tbl)){
  idx <- which(name == x)
  if(nchar(name) & length(idx)) x[idx] <- glue("{name}({1:length(idx)})")
}
x

如果问题更适合代码审查,我当然会迁移它。

标签: r

解决方案


您可以使用duplicated来查找重复和使用paste0并向seq_along它们添加索引:

for(name in unique(x[duplicated(x) & x!=""])) {
    i <- which(name == x)
    x[i] <- paste0(x[i],"(",seq_along(i),")")
}
x
#[[1]]
#[1] "&a(1)"
#
#[[2]]
#NULL
#
#[[3]]
#[1] "&b"
#
#[[4]]
#[1] "&a(2)"
#
#[[5]]
#[1] ""
#
#[[6]]
#[1] "&c(1)"
#
#[[7]]
#[1] "&c(2)"
#
#[[8]]
#[1] "&a(3)"
#
#[[9]]
#list()

推荐阅读