消除字符向量中的非唯一元素的歧义

时间:2016-01-28 13:23:57

标签: r string

给出非唯一患者姓名首字母的向量:

init = c("AA", "AB", "AB", "AB", "AC")

寻找消歧如下:

init1 = c("AA", "AB01", "AB02", "AB03", "AC")

即。唯一的首字母应该保持不变,非唯一的首字母通过添加两位数字来消除歧义。

1 个答案:

答案 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解决方案可以像这样获救: