2017-03-07 2 views
1

J'ai un dataframe avec ces 5 colonnesconditionnellement Concatenate Chaîne

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

etc

je tentais de créer une nouvelle colonne avec une concatenate conditionnelle (le résultat ne doit pas concaténer zéros)

val6 
1,3,5 
5 
1,2 

etc.

Une idée?

+1

Aussi peut-être quelque chose comme 'gsub (" NA | NA," , "", do.call (coller, c (sep = ",", remplacer (df, df == 0, NA)))) ' –

Répondre

0

Je pense qu'il s'agit d'un doublon. Cependant, ne pouvait pas trouver un répondant ainsi.

Nous pouvons utiliser apply en ligne et supprimer les éléments avec la valeur 0 et coller les valeurs restantes séparées par une virgule.

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 

Une autre option pourrait utiliser by

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

' appliquer' o n un data.frame est malheureusement très inefficace, car les données sont converties en une matrice, ce qui nécessite de copier l'ensemble des données (une disposition différente de la mémoire signifie qu'elle ne peut pas partager la représentation). –

0

Nous pouvons essayer avec replace et gsub

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