我正在使用一个数据框,该数据框有一列 (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]))
感谢您的帮助!
我们可能需要一个条件在
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)
您可以制作自己的版本
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
另一个选项也许可以使用 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"