我试图找到最有效的方法来解决R中的以下难题,而不必使用嵌套 for
循环(嵌套for
循环将永远花费):
假设我们有2个数据帧d_zone2
和stops
。在他们的柱是三个一:lat
,long
并且zone,
其描述地图划分为不同的多边形上的某些点的位置。中的zone
列d_zone2
全部初始化为NA
。现在,我想通过以下规则为in中的每个元素分配正确的值:对于zone
in中d_zone2
的每对lat-lon d_zone2
,如果对应于in中的那个lat-lon的对具有最小的Euclidean ,我就分配zone
instops
的zone
元素stops
到中的一对经纬度的距离d_zone2
。
我想到的初始解决方案是基于,然后stops
按递增顺序排列数据帧。然后对于每对in ,我可以使用嵌套循环遍历所有连续的对,以确定my in的位置。代码如下:lat
long
lat-lon
d_zone2
for
lat-lon
lat-lon
d_zone2
for(i in 1:nrow(d_zone2)){
for(j in 1:nrow(stops)){
if(d_zone2$Lat[i] >= stops$Lat[j] && d_zone2$Long[i] >= stops$Lat[j] && d_zone2$Lat[i]<= stops$Lat[j+1] && d_zone2$Long[i] <= stops$Lat[j+1]){
d_zone2$X8[i] = stops$X8[j];
}
}
}
但是,我意识到,这是不完全正确的,因为d_zone2$X8[i]
可能属于stops$X8[j+1]
(因为它lat-lon
可能是更接近到的stops$X8[j+1]
相比stops$X8[j]
)。因此,我认为唯一有效的方法是找到lat-lon
instops
中的哪对给出与一对latlon的最小欧几里得距离d_zone2
。但是我不知道如何在不使用嵌套 for()
循环的情况下在R中执行此操作。
第二种方法:另一种方法是利用存储在以下zone.csv
文件中的创建的多边形列表。现在,解决方案是从中选择一对lat-lon
ind_zone2
并stops
掉入其中的存储桶,然后将stops$X8
为该特定lat-lon
对分配的区域号分配给中的元素d_zone2
。
问题:有人可以用上面介绍的欧几里得方法或第二种方法来帮助我解决这个难题吗?我想使用dplyr::select(dplyr::left_join(x = d_zone2, y = stops%>% select("Lat", "Long", X8), by = ...)
,但是我不确定如何填写by=??
这大约需要15秒钟,因为我们首先过滤掉重复的点。这给我们留下了5457个独特点d_zone2
。对于它们中的每一个,我们计算到所有停靠点的距离,并以最小距离获取停靠点的索引。之后,您可以通过停止标识将区域与所有19228939点进行匹配。
library(sp)
library(data.table)
setDT(d_zone2)
stop_points <- as.matrix(stops[, 3:2])
short <- unique(d_zone2, by = c("Long", "Lat"))
short[, ZONE := stops[which.min(spDists(x = stop_points, y = cbind(Long, Lat))),]$X8, by=.(Long, Lat)]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句