我试图用他们的经度和纬度来计算我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)))
}
}
答案 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 = ".")
我不确定这是否会影响到你想要完成的事情,但希望确实如此。