2017-08-24 22 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

非常感谢。真的很感谢你的帮助和解释:) –

相关问题