我尝试将字符串向量拆分为 data.frame 对象,并且对于固定顺序,这不是问题(例如,像在这里写的那样),但在我的特殊情况下,未来数据帧的列在字符串对象。这是玩具输入的输出应如下所示:
input <- c("an=1;bn=3;cn=45",
"bn=3.5;cn=76",
"an=2;dn=5")
res <- do.something(input)
> res
an bn cn dn
[1,] 1 3 45 NA
[2,] NA 3.5 76 NA
[3,] 2 NA NA 5
我现在正在寻找一种do.something
可以有效地做到这一点的功能。我目前的幼稚解决方案是循环输入对象,strsplit
然后;
再循环strsplit
输入对象,=
然后按结果填充data.frame
结果。有什么办法可以做到更像R吗?恐怕一个元素一个元素地做一个 long vector 需要很长时间input
。
编辑:为了完整起见,我天真的解决方案如下所示:
do.something <- function(x){
temp <- strsplit(x,";")
temp2 <- sapply(temp,strsplit,"=")
ul.temp2 <- unlist(temp2)
label <- sort(unique(ul.temp2[seq(1,length(ul.temp2),2)]))
res <- data.frame(matrix(NA, nrow = length(x), ncol = length(label)))
colnames(res) <- label
for(i in 1:length(temp)){
for(j in 1:length(label)){
curInfo <- unlist(temp2[[i]])
if(sum(is.element(curInfo,label[j]))>0){
res[i,j] <- curInfo[which(curInfo==label[j])+1]
}
}
}
res
}
EDIT2:不幸的是,我的大输入数据看起来像这样(可能没有'='的条目):
input <- c("an=1;bn=3;cn=45",
"an;bn=3.5;cn=76",
"an=2;dn=5")
所以我无法将给定的答案与我手头的问题进行比较。我对此的天真解决方案是
do.something <- function(x){
temp <- strsplit(x,";")
tempNames <- sort(unique(sapply(strsplit(unlist(temp),"="),"[",1)))
res <- data.frame(matrix(NA, nrow = length(x), ncol = length(tempNames)))
colnames(res) <- tempNames
for(i in 1:length(temp)){
curSplit <- strsplit(unlist(temp[[i]]),"=")
curNames <- sapply(curSplit,"[",1)
curValues <- sapply(curSplit,"[",2)
for(j in 1:length(tempNames)){
if(is.element(colnames(res)[j],curNames)){
res[i,j] <- curValues[curNames==colnames(res)[j]]
}
}
}
res
}