Расчет расстояний от столицы с использованием координат [R] - PullRequest
1 голос
/ 07 февраля 2020

У меня есть 2 больших кадра данных, содержащих различные переменные, мне нужно добавить переменную distance_from_capital_city , которая будет определена как следующие:

Один кадр данных имеет всю страну названия и столицы и их координаты (cap_coordinances в примере ниже), и у меня есть другой фрейм данных, в котором есть некоторые переменные в тех же странах, иногда в столице, иногда нет.

Мне нужно добавить переменную distance_from_capital_city в блок данных real_data (в примере ниже), и результат должен выглядеть следующим образом:

Первые 4 строки переменной distance_from_capital_city в кадре данных real_data должен быть равен нулю (или некоторому небольшому числу, потому что координаты не должны точно совпадать, а ошибка округления и т. Д. c.), А последняя пятая строка должна содержать расстояние от Барселоны до Матрида ( grouped_by страна). Расстояние должно измеряться в километрах от столицы или любого евклидова расстояния или любого другого подходящего показателя.

Используя, например, эту функцию:

library(geosphere) distm(c(lon1, lat1), c(lon2, lat2), fun = distHaversine)

Я привел пример результата (цифры для иллюстрации)

library(tibble)
cap_coordinances = 
  tribble(
  ~country_txt, ~city, ~longitude, ~latitude, 
  "Greece",             "Athens",       23.8,       37.9,
  "Italy",              "Rome",         12.5,       41.9,
  "Netherlands",        "Amsterdam",     4.90,      52.4,
  "Spain",              "Madrid",       -0.743,     41.0,
)

real_data = 
tribble(
  ~country_txt,        ~city,  ~longitude,  ~latitude,
                "Greece",      "Athens", 23.762728, 37.99749,
                 "Italy",        "Rome", 12.490069, 41.89096,
  "Netherlands",        "Amsterdam",     4.90,      52.4,
  "Spain",              "Madrid",       -0.743,     41.0,
           "Spain",     "Barcelona",   2.15, 41.3

)

result = 
  tribble(
    ~country_txt, ~city,  ~longitude, ~latitude, ~distance_from_capital_city,
    "Greece", "Athens", 23.762728, 37.99749, "0 or small number",
    "Italy", "Rome", 12.490069, 41.89096, "0 or small number",
    "Netherlands", "Amsterdam", 4.90, 52.4, "0 or small number",
    "Spain", "Madrid", -0.743, 41.0, "0 or small number",
    "Spain", "Barcelona", 2.15, 41.3, 3500

  )


Я не могу решить эту проблему самостоятельно, поэтому я хотел бы попросить любого совета

Данные, которые я использую, опубликованы c можно загрузить здесь:

Ответы [ 2 ]

2 голосов
/ 07 февраля 2020

Мы можем сделать соединение и затем вычислить разницу между соответствующими столбцами «широта», «долгота»

library(dplyr)
library(geosphere)
real_data %>% 
    left_join(cap_coordinances, by = 'country_txt') %>% 
    transmute(country_txt, city = city.x,
     distance = pmap_dbl(.[c('longitude.x', 'latitude.x', 
   'longitude.y', 'latitude.y')], 
      ~ distm(c(..1, ..2), c(..3, ..4), fun = distHaversine) %>% as.vector)) 
# A tibble: 5 x 3
#  country_txt city      distance
#  <chr>       <chr>        <dbl>
#1 Greece      Athens      11335.
#2 Italy       Rome         1300.
#3 Netherlands Amsterdam       0 
#4 Spain       Madrid          0 
#5 Spain       Barcelona  244775.
0 голосов
/ 07 февраля 2020

Вот как бы вы это сделали, используя sp. Решение sf будет похоже на st_distance, и вы можете использовать каналы. Я просто нахожу приведение к пространственному объекту более прямым с помощью sp. Обратите внимание, что поскольку ваши данные в десятичных градусах, расстояние основано на расстоянии большого круга и в километрах.

library(tibble)
library(sp)

cap_coordinances = 
  tribble(
  ~country_txt, ~city, ~longitude, ~latitude, 
  "Greece",             "Athens",       23.8,       37.9,
  "Italy",              "Rome",         12.5,       41.9,
  "Netherlands",        "Amsterdam",     4.90,      52.4,
  "Spain",              "Madrid",       -0.743,     41.0,
)

real_data = 
tribble(
  ~country_txt,        ~city,  ~longitude,  ~latitude,
   "Greece",           "Athens", 23.762728, 37.99749,
   "Italy",            "Rome", 12.490069, 41.89096,
   "Netherlands",      "Amsterdam",     4.90,      52.4,
   "Spain",            "Madrid",       -0.743,     41.0,
   "Spain",            "Barcelona",   2.15, 41.3
)

coordinates(cap_coordinances) <- ~longitude+latitude
coordinates(real_data) <- ~longitude+latitude

d <- spDists(real_data, cap_coordinances, longlat = TRUE) 
  rownames(d) <- real_data$city
  colnames(d) <- cap_coordinances$city
print(d)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...