r - 根据经纬度获取 K 个最近邻

标签 r dplyr tidyverse tidy

我有不同点的纬度和经度数据。这是我的数据的简单版本:

# Add library
library(tidyverse)

# Generate data
distance <-
  tibble(
    location = c("first", "second", "third"),
    lat = c(33.720792, 33.715187, 33.714848),
    long = c(-84.468126, -84.468684, -84.454265)
  ) 
这会产生如下所示的数据:
# A tibble: 3 x 3
  location   lat  long
  <chr>    <dbl> <dbl>
1 first     33.7 -84.5
2 second    33.7 -84.5
3 third     33.7 -84.5
我想做的是利用这些纬度和经度来获得每个位置的最近邻居的完整排名。例如,理想情况下,我的最终数据如下所示:
enter image description here
如您所见,此新数据框中的第一列包含位置“first”的第一个最近邻,第二列提供下一个最近邻,依此类推。
有谁知道我如何制作我需要的数据框?

最佳答案

您可以使用 FNN 包来查找 k-最近邻。它可以很好地处理大量数据,因此即使使用大型数据集,您也应该能够使用以下代码找到完整的排名:

# Add library
library(tidyverse)
library(FNN)
#> Warning: pakke 'FNN' blev bygget under R version 4.0.4

# Generate data
distance <-
  tibble(
    location = c("first", "second", "third"),
    lat = c(33.720792, 33.715187, 33.714848),
    long = c(-84.468126, -84.468684, -84.454265)
  ) 

# Find KNN
knn <- distance %>% 
  select(lat,long) %>% 
  get.knn(k = nrow(.) - 1)

knn
#> $nn.index
#>      [,1] [,2]
#> [1,]    2    3
#> [2,]    1    3
#> [3,]    2    1
#> 
#> $nn.dist
#>             [,1]       [,2]
#> [1,] 0.005632707 0.01508173
#> [2,] 0.005632707 0.01442298
#> [3,] 0.014422985 0.01508173

# Identify locations
loc <- knn$nn.index
loc[] <- distance$location[loc]
colnames(loc) <- paste0("neighbour_",1:ncol(loc))

loc
#>      neighbour_1 neighbour_2
#> [1,] "second"    "third"    
#> [2,] "first"     "third"    
#> [3,] "second"    "first"

# final data
distance %>% 
  select(location) %>% 
  bind_cols(loc %>% as_tibble())
#> # A tibble: 3 x 3
#>   location neighbour_1 neighbour_2
#>   <chr>    <chr>       <chr>      
#> 1 first    second      third      
#> 2 second   first       third      
#> 3 third    second      first
创建于 2021-03-25 由 reprex package (v0.3.0)

关于r - 根据经纬度获取 K 个最近邻,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66806374/

相关文章:

r - 在一个向量中查找另一个向量中的值之间的值

r - 无法编织 pdf,接收到 tlmgr 搜索失败的 tinytex 错误

r - ggplot2 热图 2 种不同的配色方案 - 混淆矩阵 : Matches in Different Color Scheme than Missclassifications

r - pivot_wider() 为每个观察生成多行。重复问题?

r - 无法从 Rstudio 服务器授权 Google 表格

c - native C 程序中的 R.h 和 Rmath.h

r - 在数据框中分隔一列,其中每个观察值都可以有多个并发值

r - dplyr::select()与某些可能在数据框中不存在的变量?

r - 使用 dplyr 创建新列

r - 使用查找数据框以编程方式重命名数据框列