2017-03-07 5 views
1

Ich habe einen Datenrahmen mit diesen 5 SpaltenBedingtes Concatenate String

val1 val2 val3 val4 val5 
1 0 3 0 5 
0 0 0 0 5 
1 2 0 0 0 

etc

Ich habe versucht, eine neue Spalten mit einer bedingten verketten zu erstellen (das Ergebnis darf nicht Nullen verketten)

val6 
1,3,5 
5 
1,2 

usw.

Irgendeine Idee?

+1

auch vielleicht so etwas wie 'gsub ("NA | NA" ", do.call (einfügen, c (sep =", ", ersetzen (df, df == 0, NA)))) ' –

Antwort

0

Ich denke, das ist ein Duplikat. Allerdings konnte man keinen so antworten finden.

Wir können apply zeilenweise verwenden und entfernen Sie die Elemente mit dem Wert 0 und fügen Sie die übrigen Werte getrennt durch ein Komma.

df$val6 <- apply(df, 1, function(x) paste0(x[x!=0], collapse = ",")) 
df 

# val1 val2 val3 val4 val5 val6 
#1 1 0 3 0 5 1,3,5 
#2 0 0 0 0 5  5 
#3 1 2 0 0 0 1,2 

Eine weitere Option by

df$val6 <- by(df, 1:nrow(df), function(x) paste0(x[x!=0], collapse = ",")) 
+0

' apply' o n ein data.frame ist leider ziemlich ineffizient, da die Daten in eine Matrix umgewandelt werden, die das Kopieren der gesamten Daten erfordert (ein anderes Speicherlayout bedeutet, dass es die Repräsentation nicht teilen kann). –

0

verwenden werden kann, können wir versuchen, mit replace und gsub

gsub("NA\\s*|\\s*NA|NA+", "", do.call(paste,replace(df1, df1==0, NA))) 
#[1] "1 3 5" "5"  "1 2"