2016-11-14 6 views
3

Я работаю с очень сырым набором данных и должен его обработать, чтобы работать с ним. Я пытаюсь разделить выбранные столбцы на основе разделителя '|'Разделить несколько столбцов на строки

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')) 

Можно ли разделить dataframe на один, так это выглядит, как это в конце концов.

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')) 

До сих пор я пробовал различные различные строки расщепленные Funtions, но не везло :(

Может кто-нибудь помочь

+0

Кроме того, http://stackoverflow.com/questions/13773770 – zx8754

+1

Просто используйте двойной 'cSplit':' библиотека (splitstackshape); cSplit (cSplit (d, 'name', sep = '|', 'long'), 'score', sep = '|', 'long') ' – Jaap

ответ

7

Вот простой подход к базе R в два этапа:

1) разделить столбцы:

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

2) расширить и сочетают в себе:

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

Результат затем:

# 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

С dplyr и unnest от 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

Существует также 2 линия tidyr \ dplyr решения.

У пакета tidyr есть функция separate_rows, которая будет делать все, что вам нужно. Вам нужно два отдельных строки в двух операциях, при этом вложенные элементы не равны.

library(tidyr) 
library(dplyr) 

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

Спасибо, не поймал это на мобильных устройствах! –

+0

Что делать, если у меня есть более 1000 столбцов? – Rushabh

 Смежные вопросы

  • Нет связанных вопросов^_^