nn_geo, k = 2 в tibble - PullRequest
       29

nn_geo, k = 2 в tibble

0 голосов
/ 31 марта 2020

Я работаю с некоторыми пространственными данными и хочу превратить вывод команды st_nn (выводит список) в кадр данных, к которому я могу присоединиться. Например,

library(nngeo)
library(tidyverse)

cities <- cities
towns <- towns

nearest <- st_nn(towns, cities, returnDist = TRUE, k = 2)

Вывод списка дает мне уникальный идентификатор двух ближайших городов, а также расстояния для этих городов. , Я хотел бы это как столбик со следующими столбцами: 1) near_id, (2) near_distance, (3) second_nearest_id, (4) second_nearest_distance.

Вот что я устал

tibble(col1 = unlist(nearest[[1]]), col2 = unlist(nearest[[2]])) %>% 
  rowid_to_column(., "row_id") # for joining later on

Мне нужно найти способ сохранить идентификаторы / расстояния для двух ближайших соседей отдельно и дать идентификаторы / расстояния каждому своему столбцу.

1 Ответ

0 голосов
/ 02 апреля 2020

Вот один из способов сделать это, используя for l oop:

library(nngeo)

cities = cities
towns = towns
nearest = st_nn(towns, cities, returnDist = TRUE, k = 2)

for(k in 1:2) {
  towns[[paste0("nearest_id_", k)]] = sapply(nearest[[1]], "[", k)
  towns[[paste0("nearest_dist_", k)]] =  sapply(nearest[[2]], "[", k)
}

Полученную таблицу с новыми столбцами nearest_id_1, nearest_dist_1, nearest_id_2 и nearest_dist_2:

head(towns)
## Simple feature collection with 6 features and 8 fields
## geometry type:  POINT
## dimension:      XY
## bbox:           xmin: 34.93 ymin: 31.26 xmax: 35.33 ymax: 32.94
## CRS:            EPSG:4326
##       name country.etc   pop capital            geometry nearest_id_1
## 12  'Afula      Israel 39151       0 POINT (35.29 32.62)            3
## 17   'Akko      Israel 45606       0 POINT (35.08 32.94)            3
## 40 'Ar'ara      Israel 15841       0  POINT (35.1 32.49)            3
## 41   'Arad      Israel 22757       0 POINT (35.22 31.26)            1
## 43 'Arrabe      Israel 20316       0 POINT (35.33 32.85)            3
## 52  'Atlit      Israel  4686       0 POINT (34.93 32.68)            3
##    nearest_dist_1 nearest_id_2 nearest_dist_2
## 12       34146.94            2       76186.87
## 17       18265.72            2       98838.31
## 40       35274.25            2       53968.63
## 41       56364.74            2      100503.63
## 43       32476.24            2       99234.65
## 52       13825.36            2       67407.32

Это должно работать для любого k, которое меньше, чем число объектов во втором слое (три, в данном конкретном примере).

...