2013-09-23 8 views
7

Ich möchte einen CIGAR-Vektor auf eine CIGAR-Zeichenfolge reduzieren. Durch CIGAR Vektor String meine ich folgendes:collapse cigar vector zu string oder collapse Vektor des Zeichens, um mit entsprechenden Zahlen zu string

Ich möchte eine Funktion, die konvertiert:

cigar.vector = c("M", "M", "I", "I", "M", "I", "", "M", "D", "D", "M", "I", "D", "M", "I") 

dazu:

cigar.string = "2M2I1M1I1M2D1M1I1D1M1I" 

und umgekehrt.

Beachten Sie, dass es ein "" (leeres Zeichen) gibt, das nicht zählt. Vielen Dank!

Antwort

13

rle scheint die offensichtliche Wahl hier:

rcv <- rle(cigar.vector[cigar.vector!=""]) 
paste0(rcv$lengths,rcv$values,collapse="") 
#[1] "2M2I1M1I1M2D1M1I1D1M1I" 

Wenn Sie Lust bekommen möchten, können Sie ausnutzen auch die Tatsache, dass rle eine Liste der Länge 2 gibt: wird

paste(do.call(rbind,rle(cigar.vector[cigar.vector!=""])),collapse="") 
#[1] "2M2I1M1I1M2D1M1I1D1M1I" 

rückwärts unmöglich sein, wenn nur das Ergebnis (oben result zugewiesen), da es Informationen für die "" Fälle verloren hat. Ausgenommen diese Fälle, können Sie nah genug mit etwas wie:

+2

+1 zu schnell Mann, schlag mich um 19 Sekunden! –

+0

@thelatemail vielen Dank, funktioniert perfekt. Jilber dank dir auch, ich sah deine Antwort auch :-) – Dnaiel

+2

Ich muss etwas Schwung hinter meiner Kampagne haben, um hinzuzufügen "wenn im Zweifel, benutze rle" zum 'Vermögen' Datei :-) –