我是一名具有Python和C ++经验的新手,试图用这些语言做一些对我有意义的事情,但显然没有在R工作。我有一个JSON数组我需要从中提取数据的嵌套对象,但我需要将它们同步到单独的数组中以创建一个新的数据框,以便我可以绘制数据。
我的数据如下所示:{URL:[data], ... {VisitHistory:{0:[number], 1:[number]}}}
我试图将其放入表格格式,我在VisitHistory数组中为每个条目获取一行,但每行都有相同的URL。
这是我到目前为止所拥有的:
url<-c()
views<-c()
date<-c()
iter<-1
#bring in data
output<-fromJSON(file='filename')
#generate lists for each variable of interest
for(n in 1:length(output)) {
for(x in 1:length(output[[n]]$th)) {
url[iter]<-c(output[[n]]$url)
if(!is.null(output[[n]]$th[[x]]$sh[[1]])) {
views[iter]<-c(output[[n]]$th[[x]]$sh[[1]])
}
else {
views[iter]<-c(-1)
}
date[iter]<-c(output[[n]]$th[[x]]$ts[[1]])
iter<-iter+1
}
iter<-iter+1
}
我尝试使用iter
确保url
,views
和date
在各自的向量中保持同步,直到我将它们合并为他们自己的数据框架。但是,尝试使用iter
变量作为索引在该块中进行赋值会使循环无限循环,我无法弄清楚原因。
感谢您的帮助!
答案 0 :(得分:0)
您是否尝试在循环中打印iter
变量以查看它是否实际经历了迭代或停止某些事情?也许你的档案很大。我没有提供解决方案,只是一种帮助您调试的方法。
此外,您在for循环内为变量动态分配内存,这会使事情变得缓慢。尝试为开头的变量分配固定大小matrix
或sequence
(seq
或rep
),并在iter
变量耗尽时解除循环尺寸。如果有效,那么你知道时间就是问题。 E.g。
# Avoid dynamic allocation, which is slow
# by preallocating memory.
url<-rep(0, 10)
views<-rep(0, 10)
date<-rep(0, 10)
iter<-1
#bring in data
output<-fromJSON(file='filename')
#generate lists for each variable of interest
for(n in 1:length(output)) {
for(x in 1:length(output[[n]]$th)) {
print(iter) # print the progression
url[iter]<-c(output[[n]]$url)
if(!is.null(output[[n]]$th[[x]]$sh[[1]])) {
views[iter]<-c(output[[n]]$th[[x]]$sh[[1]])
}
else {
views[iter]<-c(-1)
}
date[iter]<-c(output[[n]]$th[[x]]$ts[[1]])
iter<-iter+1
if(iter > 10) break
}
iter<-iter+1
if(iter > 10) break
}
您可能还想考虑使用plyr包定义一个函数,并将其应用于您拥有的列表。但首先尝试我上面添加的内容,看看是否有效。另外,要找到预分配的最大迭代次数,您可以执行以下操作:
maxiter <- 0
for(i in 1:length(output)){
maxiter <- maxiter + length(output[[i]]$th)
}
另外,为什么要在外部循环中递增iter变量?你只需要在最里面的循环中增加它。