使用R将一个单元格中的数据拆分为多行

使用R将一个单元格中的数据拆分为多行,r,split,R,Split,我有一组数据: 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) 在R中,我可以将其转换为: name type content

我有一组数据:

 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)
在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来说非常陌生,因此希望您能提供一些解释。

库(stringr)
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>
调用(rbind,lappy)(1:NROW(数据),函数(i) setNames(data.frame)(数据$name[i], 数据$type[i], unlist(strsplit(如.character(数据$content[i]),“,”)), str_extract(unlist(strsplit)(如.character(数据$content[i]),“,”)), “\\d{4}”), (姓名(数据),“代码”)) #名称类型内容代码 #1 A U ABC(0001-测试)0001 #2 A U CCC(0002-测试1)0002 #3 A U DDD(0004-测试2)0004 #4 B CCC(0002-测试1)0002 #5 C D不适用
这里有一个基本的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)

很好的解决方案,太棒了。谢谢我不太明白setName函数在做什么?@Headandtoes,
setNames
:将最后的
数据的列名设置为.frame
c(名称(数据),“code”)
一个问题-如果代码可以超过4位,就说它可以是0001A或0001D(有些仍然是4位),我假设我不能使用\\d{4}?我能做些什么呢?@Headandtoes,类似于
“(\\d{4})(\\d{1})”
的东西可能会起作用。但是我不太擅长
regex
,所以如果你有更复杂的模式,你可能想问另一个高度相关的问题,可能是重复的帖子。你可以试试
res谢谢你。非常感谢您的帮助和解释:)
# 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
#     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