Используйте dput()
и вставьте результат в свой вопрос вместо таблиц:
person_location <-
structure(list(id = c(1, 2, 3, 4, 5), longitude = c(-76.67707,
-76.44519, -76.69402, -76.68936, -76.58341), latitude = c(39.399754,
39.285084, 39.36958, 39.369907, 39.357994)), class = "data.frame", row.names = c(NA,
-5L))
building_location <-
structure(list(id = c(1, 2, 3, 4, 5, 6, 7, 8, 9), longitude = c(-76.624393,
-76.457246, -76.711729, -76.631249, -76.566742, -76.683106, -76.530232,
-76.598582, -76.691287), latitude = c(39.246464, 39.336996, 39.242936,
39.289103, 39.286271, 39.35447, 39.332398, 39.344642, 39.292849
)), class = "data.frame", row.names = c(NA, -9L))
Для каждого человека вам нужно получить расстояние до каждого здания, а затем выбрать идентификатор минимального расстояния. Вот простая функция, которая делает это:
closest <- function(i) {
idx <- which.min(distHaversine(person_location[i, 2:3], building_location[, 2:3]))
building_location[idx, "id"]
}
Теперь вам просто нужно запустить ее через всех людей:
sapply(seq_len(nrow(person_location)), closest)
# [1] 6 2 6 6 8