2017-03-29 3 views
1

Ich habe zwei Vektorenentsprechender Vektor auf WAHR/FALSCH Vektor in R

> filename 
[1] "10021978_1909-07-21_ed-1_seq-4" "10021978_1910-01-19_ed-1_seq-31" 
[3] "10021978_1910-01-19_ed-1_seq-31" "10021978_1910-01-19_ed-1_seq-31" 
[5] "10021978_1910-01-19_ed-1_seq-31" "10021978_1911-06-07_ed-1_seq-12" 
[7] "10021978_1911-07-05_ed-1_seq-11" "10021978_1911-07-12_ed-1_seq-11" 
[9] "10021978_1911-07-12_ed-1_seq-11" "10021978_1911-09-27_ed-1_seq-4" 

UND

> dups = duplicated(filename) 
> dups 
[1] FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE TRUE FALSE 

Ich bin der Umgang mit Dateien zu exportieren, aber keine Dateien mit doppelten Dateinamen zu überschreiben. Ich habe einige, die Duplikate in diesem Satz von 10 sind. Was ich tun muss, ist diese Dateinamen einzigartig zu machen.

Wie kann ich einen neuen Vektor erstellen, der nichts haben würde, wo der Vektor dupsFALSE ist, und dann ungleich null wo TRUE? Die knifflige Sache ist, dass ich es beginnen muss, beginnend mit 2 inkrementierend, wenn es eine Reihe von TRUE nebeneinander gibt, dann wird zurückgesetzt, wenn es eine FALSE gibt. Der Vektor ich für diesen Satz benötigen würde:

ans = c("", "", 2, 3, 4, "", "", "", 2, "")

, so dass ich es den Dateinamen anhängen kann mit Dubletten beschäftigen. Der letzte Dateiname, den ich benötige, wäre:

[1] "10021978_1909-07-21_ed-1_seq-4" "10021978_1910-01-19_ed-1_seq-31" 
[3] "10021978_1910-01-19_ed-1_seq-31-2" "10021978_1910-01-19_ed-1_seq-31-3" 
[5] "10021978_1910-01-19_ed-1_seq-31-4" "10021978_1911-06-07_ed-1_seq-12" 
[7] "10021978_1911-07-05_ed-1_seq-11" "10021978_1911-07-12_ed-1_seq-11" 
[9] "10021978_1911-07-12_ed-1_seq-11-2" "10021978_1911-09-27_ed-1_seq-4" 

Vielen Dank im Voraus.

+1

Warum nicht einfach 'make.unique (Dateiname)'? – A5C1D2H2I1M1N2O1R2T1

+0

Schön. Diese Funktion wird mein Leben verändern. Vielen Dank! – tsouchlarakis

Antwort

2

make.unique sollte gut genug sein, aber wenn Sie die Nummerierung bei 2 beginnen müssen, ist es vielleicht einfacher zu verwenden ave.

Hier ist ein Beispiel für beide so können Sie den Unterschied zwischen den beiden Ansätzen sehen:

a <- c("a", "a", "a", "b", "c", "d", "b", "d", "e") 
make.unique(a, sep = "-") 
# [1] "a" "a-1" "a-2" "b" "c" "d" "b-1" "d-1" "e" 

dups <- ave(a, a, FUN = seq_along) 
a[duplicated(a)] <- paste(a[duplicated(a)], dups[duplicated(a)], sep = "-") 
a 
# [1] "a" "a-2" "a-3" "b" "c" "d" "b-2" "d-2" "e" 
+0

Vielen Dank, das war genau das, was ich gesucht habe. Unter dem Strich brauchte ich eindeutige Dateinamen, aber das geht einen Schritt weiter und richtet sich nach der Duplikatkonvention auf meinem Betriebssystem. Perfekt. – tsouchlarakis