Мы можем использовать алгоритм классификации *1001* k-ближайших соседей.
Пакет class имеет функцию knn1
, которая может сделать это. Он возвращает индексы ближайших соседей на основе двух фреймов данных, train
(данные, содержащие ваши "округленные" координаты) и test
(ваши фактические данные).
(ind <- knn1(train, test, cl=1:nrow(train)))
[1] 1 9 9 3 9
Levels: 1 2 3 4 5 6 7 8 9
Это показывает, что первый ряд test
ближайший к первому ряду train
, четвертый ряд ближайший к третьему ряду и все остальные ряды, ближайший к последней (9-й) строке.
Затем мы можем использовать эти индексы извлекать округленные координаты в два новых столбца (или заменить существующие).
test$longitude.rnd <- train$longitude[ind]
test$latitude.rnd <- train$latitude[ind]
test
longitude latitude longitude.rnd latitude.rnd
1 96.42604 41.45908 96.42024 41.45131
2 95.93371 41.25941 95.95712 41.34500
3 95.93137 41.25974 95.95712 41.34500
4 102.82904 41.16008 102.85215 41.11293
5 95.92670 41.26041 95.95712 41.34500
Тестовые данные : (Я изменил две строки, чтобы показать изменение, в противном случае все строки вернет 9-е)
test <- structure(list(longitude = c(96.42604, 95.93371, 95.93137, 102.82904,
95.9267), latitude = c(41.45908, 41.25941, 41.25974, 41.16008,
41.26041)), row.names = c("1", "2", "3", "4", "5"), class = "data.frame")
longitude latitude
1 96.42604 41.45908
2 95.93371 41.25941
3 95.93137 41.25974
4 102.82904 41.16008
5 95.92670 41.26041
Данные поезда : (без изменений, за исключением того, что я поменял местами столбцы в соответствии с данными теста)
train <- structure(list(longitude = c(96.42024, 96.66093, 102.85215, 96.61095,
97.40045, 96.11592, 99.53231, 96.61095, 95.95712), latitude = c(41.45131,
40.81344, 41.11293, 40.37834, 42.84468, 41.18, 40.69164, 40.37834,
41.345)), class = "data.frame", row.names = c(NA, -9L))
longitude latitude
1 96.42024 41.45131
2 96.66093 40.81344
3 102.85215 41.11293
4 96.61095 40.37834
5 97.40045 42.84468
6 96.11592 41.18000
7 99.53231 40.69164
8 96.61095 40.37834
9 95.95712 41.34500