带有生成变量的R中的for循环

时间:2015-12-18 19:48:07

标签: r loops

我试图用他们的经度和纬度来计算我25000个观测值到50个美国城市的距离。最终,我希望得到每个观测到主要城市的最小距离,并确定该城市。

我在这个循环中的问题是特定的 dist。{citygdpcoord $ city [j]} 在第二个循环中,如何指向第一个循环生成的数据帧?

for(j in 1:50)
{
  assign(paste("dist",citygdpcoord$city[j],sep="."), 0)

for(i in 1:25509) 
{
  haver <- sin((citygdpcoord$latitude[j]-geofinlit$latitude[i])/2)*
          sin((citygdpcoord$latitude[j]-geofinlit$latitude[i])/2)+
          cos(geofinlit$latitude[i])*cos(citygdpcoord$latitude[j])*
          sin(citygdpcoord$longitude[j]-geofinlit$longitude[i])*sin(citygdpcoord$longitude[j]-geofinlit$longitude[i])
  dist.{citygdpcoord$city[j]}<- data.frame(6371.393*2*atan2(sqrt(haver),sqrt(1-haver)))

}
}

1 个答案:

答案 0 :(得分:0)

嗯,你最大的问题是dist.{citygdpcord$city[j]}将被覆盖25509次,只保存最后一个值。我建议改变一些事情。首先,使用矩阵并在最后将它们转换为数据集。这样,您可以预先分配对象大小,而不是在循环时增长它。此外,将您的数据框存储在一个列表中,这样您只有一个对象,而不是50.也许是这样的?

dat <- lapply(1:50, function(j) { 
  tmp <- matrix(0, nrow = 25509, ncol = 1) 
  for (i in 1:25509) { 
    haver <- ... # removed code for simplicity
    tmp[i, ] <- c(6371.393*2*atan2(sqrt(haver), sqrt(1-haver)))
  }
  return(as.data.frame(tmp)) 
})

然后将您的列表命名为names(dat) <- paste("dist",citygdpcoord$city[1:50], sep = ".")

我不确定这是否会影响到你想要完成的事情,但希望确实如此。