将字母附加到数据框中的重复值

问题描述 投票:0回答:3

我正在使用一个数据框,该数据框有一列 (ID) 包含一堆项目的 ID。不幸的是,其中一些 ID 是重复的(但项目不是)。

我希望通过在重复值的末尾添加(.a、.b、.c 等)来使重复值的 ID 唯一。我不能使用数字(或 make.unique 函数),因为 ID 的末尾有数字,这可能会造成混淆。

我目前有以下内容,但它为每个 ID 附加了一个字母。有什么我可以添加的,这样它只会影响重复的 ID 吗?

df$ID <- ave(df$ID, df$ID, FUN = function(i) paste0(i, '.', letters[1:20]))

感谢您的帮助!

r duplicates unique
3个回答
3
投票

我们可能需要一个条件在

length
ing
之前检查
paste

ave(df$ID, df$ID, FUN = function(i) 
    if(length(i) > 1) {
    i[-1] <- paste0(i[-1], '.', letters[seq(length(i[-1]))]); i} else i)

3
投票

您可以制作自己的版本

make.unique

my_make_unique = function(x) {
  if(length(x) > 27) stop("Too many values to make unique with single letters!")
  paste0(x, c("", paste0(".", letters[1:(length(x) - 1)])))
}

## test it
my_make_unique(c(1, 1, 1, 2, 2, 3))
# [1] "1"   "1.a" "1.b" "2.c" "2.d" "3.e"
## looks good

0
投票

另一个选项也许可以使用 make.unique 并替换字母的数字,但如果这适合您的情况,则在很大程度上取决于您 ID 的结构。例如,我假设您的 ID 中没有点。

ids <- as.character(c(1,2,3,1,1,1,2,3,4))

r <- letters[as.numeric(str_extract(make.unique(ids), "(?<=\\.)(\\d*$)"))]
i <- which(!is.na(r))
ids[i] <- paste(ids[i], r[i], sep = ".")

ids

[1] "1"   "2"   "3"   "1.a" "1.b" "1.c" "2.a" "3.a" "4"
© www.soinside.com 2019 - 2024. All rights reserved.