2017-08-24 67 views
0

我有一組數據:使用R鍵在一個單元格的數據拆分成多行

name<-c("A","B","C") 
type<-c("U","","D") 
content<-c("ABC (0001 - test), CCC (0002 - test1), DDD (0004 - test 2)", "CCC (0002 - test1)", "N/A") 
data<-data.frame(name,type,content) 

它看起來像這樣:

name type             content 
    A U  ABC (0001 - test), CCC (0002 - test1), DDD (0004 - test 2) 
    B             CCC (0002 - test1) 
    C D               N/A 

在R,可我把它轉變爲:

name type   content    code 
A  U   ABC (0001 - test) 0001 
A  U   CCC (0002 - test1) 0002 
A  U   DDD (0004 - test 2) 0004 
B     CCC (0002 - test1) 0002 
C  D   N/A     N/A 

我不知道我是否可以在R中做到這一點?誰能幫忙?
很新的R,所以一些解釋將不勝感激。

+0

高度相關的,也許重複的信息[這裏](https://開頭計算器的.com /問題/ 45849727 /如何對定製弄平-A-數據幀)。 – lmo

+0

你可以嘗試'res < - splitstackshape :: cSplit(data,「content」,direction =「long」); res $ code < - stringr :: str_extract(res $ content,「\\ d {4}」)' –

回答

2
library(stringr) 
do.call(rbind, lapply(1:NROW(data), function(i) 
    setNames(data.frame(data$name[i], 
         data$type[i], 
         unlist(strsplit(as.character(data$content[i]), ", ")), 
         str_extract(unlist(strsplit(as.character(data$content[i]), ", ")), 
            "\\d{4}")), 
      c(names(data), "Code")))) 
# name type    content Code 
#1 A U ABC (0001 - test) 0001 
#2 A U CCC (0002 - test1) 0002 
#3 A U DDD (0004 - test 2) 0004 
#4 B  CCC (0002 - test1) 0002 
#5 C D     N/A <NA> 
+1

偉大的解決方案。 – Sagar

+0

令人驚歎。謝謝!我不太明白setName函數在做什麼? –

+0

@Headandtoes,'setNames':將最後一個'data.frame'的列名設置爲'c(names(data),「Code」)' –

3

這裏有一個基礎R方法:

# split the contents by comma: 
x <- strsplit(as.character(data$content), ", ", fixed = T) 
# add new rows with each content: 
data <- cbind(data[rep(1:nrow(data), lengths(x)), 1:2], content = unlist(x)) 
# extract and add the code: 
data$code <- sub(".*\\((\\d+)\\s.*", "\\1", data$content) 

產生的data.frame看起來是這樣的:

data 
#  name type    content code 
# 1  A U ABC (0001 - test) 0001 
# 1.1 A U CCC (0002 - test1) 0002 
# 1.2 A U DDD (0004 - test 2) 0004 
# 2  B  CCC (0002 - test1) 0002 
# 3  C D     N/A N/A 
+0

非常感謝。真的很感謝你的幫助和解釋:) –