2013-09-30 50 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 ])