2013-09-30 49 views
1

考虑下面的示例数据集:字符串分割成重复行

col1 <- c("X1","X2","X3|X4|X5","X6|X7") 
col2 <- c("5","8","1","4") 
dat <- data.frame(col1,col2) 

我如何通过|分裂col1,并输入他们与复制col2值不同的行?下面是我想直到结束数据框:

col1 col2 
    X1 5 
    X2 8 
    X3 1 
    X4 1 
    X5 1 
    X6 4 
    X7 4 

我需要一个可以容纳类似col2多列也需要被复制的解决方案。

+0

欢迎StackOverflow上多列!由于您是新手,请花些时间阅读[关于Stackoverflow](http://stackoverflow.com/about)和[如何提问](http://meta.stackoverflow.com/help/how-to -问)。你已经提供了一个[最小的,可重现的数据集]是很好的(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610#5963610)。但是,向您展示您尝试的内容也很重要。我相信,如果您分享您尝试过的代码并解释出错的地方,那么许多人(例如我)会更愿意提供帮助。谢谢! – Henrik

+1

你可以从我的“splitstackshape”包中尝试'concat.split.multiple':'library(splitstackshape); concat.split.multiple(dat,“col1”,“|”,“long”)'。 – A5C1D2H2I1M1N2O1R2T1

回答

3

只需分割字符串,然后根据长度重复其他列。

y<-strsplit(as.character(dat[,1]) , "|", fixed=TRUE) 
data.frame(col1= unlist(y), col2= rep(dat[,2], sapply(y, length))) 
    col1 col2 
1 X1 5 
2 X2 8 
3 X3 1 
4 X4 1 
5 X5 1 
6 X6 4 
7 X7 4 

如果你需要重复除第一

data.frame(col1= unlist(y), dat[ rep(1:nrow(dat), sapply(y, length)) , -1 ])