2016-11-14 107 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')) 

是否有可能在一個,所以它看起來像這樣在最後的數據幀分割。

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

隨着dplyrunnesttidyr

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