2017-08-07 3 views
0

J'ai un format séparé où je vais avoir ces données:colonne de Split en fonction de certain format de séparation

df = data.frame(id=c(1,2),name=c('A~B~C','A~B~D'),value=c('1~2~3','1~~2')) 
id name  value 
1 A~B~C  1~2~3 
2 A~B~D  1~~2 

qui devrait avoir la sortie suivante où le nom de la colonne est le nom de la colonne d'origine suivi du texte dans la colonne nom:

id value_A value_B value_C value_D 
1  1   2   3  
2  1       2 

je parviens à obtenir le fractionnement du nombre en utilisant pour les boucles imbriquées pour traiter ma ligne de données par ligne. Cela fonctionne sur de petites données d'échantillon mais une fois que les données deviennent énormes, le temps est un problème.

De même, il peut y avoir plus d'une colonne de valeur, mais toutes doivent correspondre à la même colonne de nom. sortie Exemple:

id value_A value_B value_C value1_A value1_B value1_C 
1  1   2   3  1   2   3 
2  1   2   3  1   2   3 

Répondre

0

Voici une option utilisant cSplit/dcast. Diviser les lignes en format « long » avec cSplit et dcast au format « large »

library(splitstackshape) 
dcast(cSplit(df, c('name','value'), '~', 'long')[!is.na(value)], id ~ paste0('value_', name)) 
# id value_A value_B value_C value_D 
#1: 1  1  2  3  NA 
#2: 2  1  NA  NA  2 
+0

Si disons que j'ai une value1 et value2 colonnes. Quels changements puis-je apporter au 'dcast' pour le rendre capable de jeter les valeurs? Je sais que je peux utiliser 'cSplit (df, c ('nom', 'valeur1', 'valeur2'), '~', 'long')' pour diviser les 3 colonnes. – kaexch

2

Vous pouvez dplyr:

library(tidyverse) 
df %>% 
separate_rows(name, value, sep = "~") %>% 
spread(name, value) 
    id A B C D 
1 1 1 2 3 <NA> 
2 2 1 <NA> 2 

Au lieu de NA vous pouvez remplir les cellules vides par tout ce que vous spécifiez dans les fill = ""

Ou Baser et reshape2:

a <- strsplit(as.character(df$name), "~") 
b <- strsplit(as.character(df$value), "~") 
df2 <- do.call(rbind.data.frame, Map(cbind, df$id, a, b)) 
library(reshape2) 
dcast(df2, V1~V2, value.var = "V3") 
    A B C D 
1 1 2 3 <NA> 
2 1 <NA> 2 
+0

Est-il possible d'ajouter VALUE_ (le nom de la colonne d'origine) dans chacune des colonnes? – kaexch

+0

ajouter dans le premier exemple 'select (id, valeur_A = A, valeur_B = B, valeur_C = C, valeur_D = D)' ou renommer le data.frame résultant (enregistré dans la variable 'df1' par exemple) en utilisant' colnames (df1) [- 1] <- paste0 ("valeur_", colnames (df1) [- 1]) ' – Jimbou