给出非唯一患者姓名首字母的向量:
init = c("AA", "AB", "AB", "AB", "AC")
寻找消歧如下:
init1 = c("AA", "AB01", "AB02", "AB03", "AC")
即。唯一的首字母应该保持不变,非唯一的首字母通过添加两位数字来消除歧义。
答案 0 :(得分:4)
将指定的功能与ave
:
uniquify <- function(x) if (length(x) == 1) x else sprintf("%s%02d", x, seq_along(x))
ave(init, init, FUN = uniquify)
## [1] "AA" "AB01" "AB02" "AB03" "AC"
如果基本要求只是为了确保唯一输出,那么另一个答案和评论所讨论的make.unique(x)
或make.unique(x, sep = "0")
是简明扼要的,但如果要求输出与问题完全相同那么他们没有给出相同的结果。如果有10个或更多重复,那些答案的输出变化甚至更多;但是,这里的解决方案确实给出了相同的答案。这是一个说明10个或更多重复的另一个例子。
xx <- rep(c("A", "B", "C"), c(1, 10, 2))
ave(xx, xx, FUN = uniquify)
## [1] "A" "B01" "B02" "B03" "B04" "B05" "B06" "B07" "B08" "B09" "B10" "C01" "C02"
make.unique解决方案可以像这样获救: