У меня 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
из library(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 :=
и distance :=
.
Я ожидал, что этот цикл перезапишет muni
, так что весь столбец будет иметь station_number
.
muni
наблюдение с его ближайшимstation
, а не первое наблюдение изstation
набора данных на глубине менее 5000 метров? - person Fons MA   schedule 11.02.2019