使用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