2016-01-28 4 views
5

非ユニークな患者のイニシャルのベクトルを考えると次のように曖昧さ回避のために探し文字ベクトルで明確に非ユニークな要素

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

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

をすなわちユニークなイニシャルを変更しないままにしておく必要があり、 2桁の数字を追加することによって、一意でないものを明確にします。

答えて

4

aveと指示された機能を使用し:基本的な要件は別の答えとコメントで述べたようにちょうどそのmake.unique(x)make.unique(x, sep = "0")をユニークな出力を確保することである場合

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" 

は簡潔ですが、要件は、出力された場合まったく同じようなものでなければ、同じ結果は得られません。重複が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溶液は次のように救出することができる:

+0

良い点、make.uniqueは、この場合、B及びB.Xの醜い混合物を与えます。 –

+0

@akrun:あなたのソリューションを削除して申し訳ありません。 –