#r #dataframe #math #latitude-longitude #haversine
#r #фрейм данных #математика #широта-долгота #haversine
Вопрос:
У меня есть два файла CSV в формате, как показано ниже
Файл1.csv
Sr Lat,Long
1 52.361176,4.899779
2 52.34061,4.871195
3 52.374749,4.893847
4 52.356624,4.912281
5 52.374026,4.883685
6 52.369956,4.919778
7 52.370895,4.8703
8 52.390454,4.915024
9 52.378576,4.900253
10 52.378372,4.896219
11 52.380056,4.899697
12 52.383744,4.875805
13 52.369981,4.881528
14 52.375954,4.904786
15 52.344417,4.891211
......1000 columns
File2.csv
neighbourhood LAT,LONG
Bijlmer-Centrum 52.3135175, 4.9547795
Bijlmer-Oost 52.3179787, 4.9754974
Bos en Lommer 52.3807577, 4.8545966
Buitenveldert - Zuidas 52.3382516, 4.872921499999999
Centrum-Oost 51.208107, 4.4249047
Centrum-West 52.0607927, 4.4832451
De Aker - Nieuw Sloten 52.3447535, 4.811520799999999
De Baarsjes - Oud-West 52.367746, 4.854258
De Pijp - Rivierenbuurt 52.3560276, 4.9021384
........500columns
Я хочу вычислить пары кратчайших расстояний между двумя файлами (возможно, расположенные в порядке убывания).Кроме того, каждая пара в File1 должна соответствовать ближайшему местоположению в File2, т. Е. Ни одна запись в File1 не должна быть пропущена. В качестве примера рассмотрим первую пару широта-длина в file1 52.361176,4.899779
, мне нужно расстояние этой пары с каждой другой парой в File2 и аналогично сделать это для всех других записей в File1. Это формула, которую мне нужно использовать (она на python)
def distance(lat1, lon1, lat2, lon2):
p = pi/180
a = 0.5 - cos((lat2-lat1)*p)/2 cos(lat1*p) * cos(lat2*p) * (1-cos((lon2-lon1)*p))/2
return 12742 * asin(sqrt(a))
Я новичок в R и, следовательно, прошу экспертов на этом форуме помочь.
РЕДАКТИРОВАТЬ: File1 и File2 содержат больше записей, чем указано здесь, это всего лишь фрагмент. Исходные файлы содержат более 1000 и 500 столбцов соответственно.
Комментарии:
1. вы могли бы взглянуть на
geosphere::distHaversine
2. я видел подобные вопросы на SO несколько раз за последние пару лет. Вы просмотрели их ответы?
Ответ №1:
вот пространственное соединение с использованием sf
… data.table::fread()
используется для создания образцов данных.
#make spatial objects
sf1 <- file1 %>% sf::st_as_sf( coords = c("Long", "Lat"), crs = 4326 )
sf2 <- file2 %>% sf::st_as_sf( coords = c("LONG", "LAT"), crs = 4326 )
st_join( sf1, sf2, join = st_nearest_feature )
#
# Simple feature collection with 15 features and 3 fields
# geometry type: POINT
# dimension: XY
# bbox: xmin: 4.8703 ymin: 52.34061 xmax: 4.919778 ymax: 52.39045
# geographic CRS: WGS 84
# First 10 features:
# Sr neighbourhood geometry
# 1 1 De Pijp - Rivierenbuurt POINT (4.899779 52.36118)
# 2 2 Buitenveldert-Zuidas POINT (4.871195 52.34061)
# 3 3 De Pijp - Rivierenbuurt POINT (4.893847 52.37475)
# 4 4 De Pijp - Rivierenbuurt POINT (4.912281 52.35662)
# 5 5 De Pijp - Rivierenbuurt POINT (4.883685 52.37403)
# 6 6 De Pijp - Rivierenbuurt POINT (4.919778 52.36996)
# 7 7 De Baarsjes - Oud-West POINT (4.8703 52.37089)
# 8 8 De Pijp - Rivierenbuurt POINT (4.915024 52.39045)
# 9 9 De Pijp - Rivierenbuurt POINT (4.900253 52.37858)
# 10 10 De Pijp - Rivierenbuurt POINT (4.896219 52.37837)
пример использованных данных
library(sf)
library(data.table)
file1 <- data.table::fread("
Sr Lat Long
1 52.361176 4.899779
2 52.34061 4.871195
3 52.374749 4.893847
4 52.356624 4.912281
5 52.374026 4.883685
6 52.369956 4.919778
7 52.370895 4.8703
8 52.390454 4.915024
9 52.378576 4.900253
10 52.378372 4.896219
11 52.380056 4.899697
12 52.383744 4.875805
13 52.369981 4.881528
14 52.375954 4.904786
15 52.344417 4.891211")
file2 <- data.table::fread(' neighbourhood LAT LONG
"Bijlmer-Centrum" 52.3135175 4.9547795
"Bijlmer-Oost" 52.3179787 4.9754974
"Bos en Lommer" 52.3807577 4.8545966
"Buitenveldert-Zuidas" 52.3382516 4.872921499999999
"Centrum-Oost" 51.208107 4.4249047
"Centrum-West" 52.0607927 4.4832451
"De Aker - Nieuw Sloten" 52.3447535 4.811520799999999
"De Baarsjes - Oud-West" 52.367746 4.854258
"De Pijp - Rivierenbuurt" 52.3560276 4.9021384')
Комментарии:
1. Спасибо за помощь, но у меня есть несколько вопросов. 1. Могу ли я вместо отображения 10 лучших функций получить сводку по всем парам? 2. Возможно ли также рассчитать расстояние? 3. Насколько точен этот метод по сравнению с формулой haversine?
2. Вы запустили код и файлы справки используемых функций и пакетов?
3. Да, я сделал, но не могу понять, как отобразить все вместо 10 лучших функций
4. вы должны сохранить результат в объекте…
mything <- .....