使用嵌套for循环和外部计数器在R中遇到问题

时间:2016-03-22 15:21:20

标签: arrays json r loops vector

我是一名具有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确保urlviewsdate在各自的向量中保持同步,直到我将它们合并为他们自己的数据框架。但是,尝试使用iter变量作为索引在该块中进行赋值会使循环无限循环,我无法弄清楚原因。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您是否尝试在循环中打印iter变量以查看它是否实际经历了迭代或停止某些事情?也许你的档案很大。我没有提供解决方案,只是一种帮助您调试的方法。

此外,您在for循环内为变量动态分配内存,这会使事情变得缓慢。尝试为开头的变量分配固定大小matrixsequenceseqrep),并在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变量?你只需要在最里面的循环中增加它。

相关问题