2016-11-14 192 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