У меня есть 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
.