Я стремлюсь определить ближайшую запись в наборе данных 2 для каждой записи в наборе данных 1 на основе координат в обоих наборах данных.Набор данных 1 содержит 180 000 строк (всего 1800 уникальных координат), а набор данных 2 содержит 4500 строк (полных 4500 уникальных координат).
Я попытался повторить ответы на аналогичные вопросы по stackoverflow.например:
R - Нахождение ближайшей соседней точки и количества соседей в пределах данного радиуса, координаты широта-долгота
Расчет расстояния между точками в разныхфреймы данных
Однако они не решают проблему так, как я хочу (они либо присоединяются к фреймам данных, либо проверяют расстояния в одном фрейме данных).
Решение в Найдите ближайшую координату X, Y, используя R и связанные посты являются ближайшими, которые я нашел до сих пор.
Моя проблема с постом в том, что он определяет расстояниемежду координатами в одном кадре данных, и я не смог понять, какие параметры нужно изменить в RANN::nn2
, чтобы сделать это в двух кадрах данных.
Предлагаемый код, который не работает:
library(RANN)
dataset1[,4]<- nn2(data=dataset1, query=dataset2, k=2)
Примечания / Вопросы:
1) Какой набор данных следует предоставить запросу, чтобы найти наиболее близкое значение в наборе данных 2 к заданному значению в наборе данных 1?
2) Есть ли какие-либопутьчтобы избежать проблемы, когда наборы данных должны иметь одинаковую ширину (количество столбцов)?
3) Как можно добавить выходные данные (SRD_ID
и distance
) к соответствующей записи в наборе данных1?
4) Как использовать параметр eps
в функции RANN::nn2
?
Цель состоит в том, чтобы заполнить столбцы SRC_ID
и distance
в наборе данных 1идентификатор ближайшей станции из набора данных 2 и расстояние между записью в наборе данных 1 и ближайшей записью в наборе данных 2.
Ниже приведена таблица, демонстрирующая ожидаемые результаты. Примечание: значения SRC_ID
и distance
являются примерами значений, которые я сам добавил вручную, почти наверняка неверны и, скорее всего, не будут реплицированы кодом.
id HIGH_PRCN_LAT HIGH_PRCN_LON SRC_ID distance
1 3797987 52.88121 -2.873734 55 350
2 3798045 53.80945 -2.439163 76 2100
Данные:
r подробности
platform x86_64-w64-mingw32
version.string R version 3.5.3 (2019-03-11)
набор данных 1 вход (не сужен до уникальных координат)
structure(list(id = c(1L, 2L, 4L, 5L,
6L, 7L, 8L, 9, 10L, 3L),
HIGH_PRCN_LAT = c(52.881442267773, 57.8094538200198, 34.0233529,
63.8087900198, 53.6888144440184, 63.4462810678651, 21.6075544376207,
78.324442654172, 66.85532539759495, 51.623544596), HIGH_PRCN_LON = c(-2.87377812157822,
-2.23454414781635, -3.0984448341, -2.439163178635, -7.396111601421454,
-5.162345043546359, -8.63311254098095, 3.813289888829932,
-3.994325961186105, -8.9065532453272409), SRC_ID = c(NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA), distance = c(NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA)), row.names = c(NA, 10L), class = "data.frame")
набор данных 2 ввода
structure(list(SRC_ID = c(55L, 54L, 23L, 11L, 44L, 21L, 76L,
5688L, 440L, 61114L), HIGH_PRCN_LAT = c(68.46506, 50.34127, 61.16432,
42.57807, 52.29879, 68.52132, 87.83912, 55.67825, 29.74444, 34.33228
), HIGH_PRCN_LON = c(-5.0584, -5.95506, -5.75546, -5.47801, -3.42062,
-6.99441, -2.63457, -2.63057, -7.52216, -1.65532)), row.names = c(NA,
10L), class = "data.frame")