2016-11-14 1 views
3

Je travaille avec un ensemble de données très brutes et j'ai besoin de le façonner pour pouvoir l'utiliser. Je suis en train de diviser les colonnes sélectionnées en fonction de l'écrémeuse '|'Division de plusieurs colonnes en lignes

d <- data.frame(id = c(022,565,893,415), 
    name = c('c|e','m|q','w','w|s|e'), 
    score = c('e','k|e','e|k|e', 'e|o')) 

Est-il possible de diviser la trame de données à l'un de sorte qu'il ressemble à ceci à la fin.

df <- data.frame(id = c(22,22,565,565,565,565,893,893,893,415,415,415,415,415,415), 
      name = c('c','e','m','m','q','q','w','w','w','w','w','s','s','e','e'), 
      score = c('e','e','k','e','k','e','e','k','e','e','o','e','o','e','o')) 

Jusqu'à présent, j'ai essayé plusieurs différentes funtions split string mais n'ont pas eu beaucoup de chance :(

Quelqu'un peut-il aider à

+0

En outre, http://stackoverflow.com/questions/13773770 – zx8754

+1

Il suffit d'utiliser un double 'cSplit':' bibliothèque (splitstackshape); cSplit (cSplit (d, 'nom', sep = '|', 'long'), 'score', sep = '|', 'long') ' – Jaap

Répondre

7

Voici une approche de base R simple en deux étapes:

1) divisé les colonnes:

x <- lapply(d[-1], strsplit, "|", fixed = TRUE) 

2) se dilatent et se combinent:

d2 <- setNames(do.call(rbind, Map(expand.grid, d$id, x$name, x$score)), names(d)) 

Le résultat est alors:

# id name score 
#1 22 c  e 
#2 22 e  e 
#3 565 m  k 
#4 565 q  k 
#5 565 m  e 
#6 565 q  e 
#7 893 w  e 
#8 893 w  k 
#9 893 w  e 
#10 415 w  e 
#11 415 s  e 
#12 415 e  e 
#13 415 w  o 
#14 415 s  o 
#15 415 e  o 
1

Avec dplyr et unnest de tidyr:

library(dplyr) 
library(tidyr) 
d %>% mutate(name=strsplit(name,split="[|]")) %>% 
     group_by(id) %>% 
     unnest() %>% 
     mutate(score=strsplit(score,split="[|]")) %>% 
     unnest() 
##Source: local data frame [15 x 3] 
##Groups: id [4] 
## 
##  id name score 
## <dbl> <chr> <chr> 
##1  22  c  e 
##2  22  e  e 
##3 565  m  k 
##4 565  m  e 
##5 565  q  k 
##6 565  q  e 
##7 893  w  e 
##8 893  w  k 
##9 893  w  e 
##10 415  w  e 
##11 415  w  o 
##12 415  s  e 
##13 415  s  o 
##14 415  e  e 
##15 415  e  o 
3

Il y a également 2 ligne tidyr \ dplyr solution.

Le package tidyr dispose d'une fonction appelée separate_rows qui répondra à vos besoins. Vous avez besoin de deux séparer les lignes dans deux opérations avec les éléments imbriqués n'étant pas égaux.

library(tidyr) 
library(dplyr) 

df <- separate_rows(d, name, sep = "\\|") %>% 
separate_rows(score, sep = "\\|") 
+0

Merci, n'a pas attrapé ça sur mobile! –

+0

Et si j'ai plus de 1000 colonnes? – Rushabh