我有一个data.table
957 地理编码。我想将它与另一个具有 317 个地理编码的数据集相匹配。匹配条件是地理空间接近度。我想将第一个数据集中的每个观察结果与第二个数据集中的观察结果相匹配,以使两个观察结果之间的距离为 5000 米或更小。
我的数据如下所示:
> muni[1:3]
mun Lat_Decimal Lon_Decimal
1: 1001 21.76672 -102.2818
2: 1002 22.16597 -102.0657
3: 1003 21.86138 -102.7248
> stations[1:3]
station_number station_lat station_long
1: 10003 25.100 -106.567
2: 10018 24.944 -106.259
3: 10031 24.523 -105.952
我正在使用distm
函数 fromlibrary(geosphere)
来计算距离。
我想解决这个问题的方法是while
循环。这个想法是从 中获取第一个观测值muni
并测量到第一个观测值的距离stations
。如果距离为 5000 米或更短,则将 中的第一个观测值分配给station_number
中的第station
一个观测值muni
。如果距离大于 5000,则尝试下一次观察,muni
直到距离小于或等于 5000 米。
本质上,它是一个循环,可以在stations
5000 米或更接近muni
.
这是一个初步的尝试:
for (i in 1:957) {
j = 1
while (distm(muni[i, .(Lon_Decimal, Lat_Decimal)],
stations[j, .(station_long, station_lat)]) > 5000 & j <= 317) {
muni[i, station_number := as.integer(stations[j, station_number])]
muni[i, distance := distm(muni[i, .(Lon_Decimal, Lat_Decimal)],
stations[j, .(station_long, station_lat)])]
j = j + 1
}
}
我可以说这不起作用,因为在运行此循环后,“muni”中的行似乎都没有被覆盖for (i in 1:3)
。我想我的循环中有一个错误忽略了station_number :=
anddistance :=
部分。
我希望这个循环会覆盖muni
整个列,这样所有的列都有一个station_number
.