gpt4 book ai didi

string - 输入不完整的strsplit成data.frame

转载 作者:行者123 更新时间:2023-12-04 17:10:06 27 4
gpt4 key购买 nike

我尝试将字符串向量拆分为 data.frame 对象,对于固定顺序,这不是问题(例如写 here ),但在我的特殊情况下, future 数据框的列不完整在字符串对象中。玩具输入的输出应该是这样的:

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?恐怕对于长向量 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
}

编辑2:
不幸的是,我的大输入数据看起来像这样(没有 '=' 的条目可能):
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
}

最佳答案

这是一种糟糕的技术,但有时ept ( eval parse text ) 很有用。

> library(plyr)
> rbind.fill(lapply(input, function(x) {l <- new.env(); eval(parse(text = x), envir=l); as.data.frame(as.list(l))}))
an cn bn dn
1 1 45 3.0 NA
2 NA 76 3.5 NA
3 2 NA NA 5

更新
> z <- lapply(strsplit(input, ";"), 
+ function(x) {
+ e <- Filter(function(y) length(y)==2, strsplit(x, "="))
+ r <- data.frame(lapply(e, `[`, 2))
+ names(r) <- lapply(e, `[`, 1)
+ r
+ })
> rbind.fill(z)
an bn cn dn
1 1 3 45 <NA>
2 <NA> 3.5 76 <NA>
3 2 <NA> <NA> 5

关于string - 输入不完整的strsplit成data.frame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19927830/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com