Агрегировать характеристику k ближайших соседей - PullRequest
0 голосов
/ 14 октября 2019

У меня есть два набора точечных данных: x и y .

Для каждой точки в x я хотел бы найтисреднее значение некоторой характеристики его k ближайших соседей в y .

Ниже приведены некоторые фиктивные данные. Для каждого x я ищу среднее значение "Land" для его 3 ближайших соседей y.

library(tidyverse)
library(sf)

x <- st_read("https://data.sfgov.org/api/geospatial/p5b7-5n3h?method=export&format=GeoJSON") %>% 
  st_transform(2272) %>% 
  st_make_grid(., cellsize = 10000, square = FALSE) %>% 
  st_centroid()

y <- st_read("https://data.sfgov.org/api/geospatial/rarb-5ahf?method=export&format=GeoJSON") %>% 
  st_transform(2272) %>%
  st_centroid() %>% 
  mutate(Land = as.numeric(as.character(aland10))) %>% 
  select(Land)

Одна вещь, которую я попробовал, это get.knnx () из пакета FNN, который возвращаетматрица x строк и k столбцов, где каждое значение является номером строки для k -го ближайшего объекта в y . Однако я не уверен, что делать дальше.

library(sf)
library(FNN)

index <- get.knnx(st_coordinates(y), st_coordinates(x), 3)$nn.index

head(index)

     [,1] [,2] [,3]
[1,]   36   98  163
[2,]   98  163   36
[3,]   98   36  163
[4,]   36   98  163
[5,]   36   98   97
[6,]   98  163  144

Спасибо за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

Так близко! apply над строками (1) индексной матрицы ближайшего соседа, используя каждую строку в функции для подмножества вектора Land из y и вычисления среднего значения:

> apply(index, 1, function(i){mean(y$Land[i])})
 [1] 1144241.0 1852318.3  518192.3  861482.7  870405.3 1735791.3  524817.7
 [8] 1128206.0  458384.0  813126.3 1018941.0  935856.0  357886.3  783506.7
[15] 1321931.0 1691426.0  714128.7  502033.3  300172.0  235375.0 1246772.3
[22] 1691426.0  521444.3  657274.0 2353606.3  411458.3 1393687.0

Если выхочу добавить это как столбец в x do x$MeanYLand = apply(...etc..)

Вы можете проверить это вручную для первой пары:

> mean(y$Land[index[1,]])
[1] 1144241
> mean(y$Land[index[2,]])
[1] 1852318
0 голосов
/ 18 октября 2019

Я думаю, что это делает то, что вы после:

library(tidyverse)
library(sf)
library(nngeo)

x <- st_read("https://data.sfgov.org/api/geospatial/p5b7-5n3h?method=export&format=GeoJSON") %>% 
  st_transform(2272) %>% 
  st_make_grid(., cellsize = 10000, square = FALSE) %>% 
  st_centroid()

y <- st_read("https://data.sfgov.org/api/geospatial/rarb-5ahf?method=export&format=GeoJSON") %>% 
  st_transform(2272) %>%
  st_centroid() %>% 
  mutate(Land = as.numeric(as.character(aland10))) %>% 
  select(Land)

k <- 3
nn <- st_nn(x, y, k=k)

# Method 1:
# Returns a vector of the mean land values
meanLandValues <- sapply(nn, FUN=function(indices){
    mean(y$Land[indices])
})

# Method 2:
# This way will keep the spatial attribute

# Add an ID column so that we can perform a spatial join later
x <- st_sf(data.frame(ID=1:length(x), geom=x))

joined <- st_join(x, y, join=st_nn, k=3, progress=FALSE)
meanLandValuesSF <- aggregate(joined, by=list(joined$ID), FUN=mean)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...