我有两个德国邮政编码列表(长度不同(。我需要为第一个数据帧中相对于第二个列表的每个数据帧找到最接近的邮政编码邻居。我也有经度和纬度的信息。如果能看看哪个plz最接近,那就太好了,但我的主要兴趣是距离测量(目前我对任何距离测量都很灵活(。我可以计算所有可能的组合(2000000(,并通过geosphere
软件包或谷歌地图DirectionFinder
计算它们的距离(并选择最小的距离(。我想我需要申请某种形式的https://en.wikipedia.org/wiki/Nearest_neighbor_search大约有10000个始发地和200个目的地。我发现RANN
包和nn2()
带有选项searchtype = priority
而不是searchtype = radius
(我不需要(。
plz city lon lat
1 69115 Heidelberg 8.6934499740601 49.406078338623
2 44137 Dortmund 7.4582135 51.5143952
3 70178 Stuttgart 9.17115 48.77426
4 68159 Mannheim 8.4696736826668 49.491940248873
5 68167 Mannheim 8.4971965 49.5038859
plz city lon lat
1 76530 Baden-Baden 8.2423068 48.7438178
2 89081 Ulm 9.961367 48.4253282
3 69120 Heidelberg 8.6752461 49.4225417
4 72076 Tübingen 9.0406256 48.5312051
5 74523 Schwäbisch-Hall 9.7424451 49.1247435
我会使用FNN
包,根据经度和纬度的欧几里得距离,为每个plz
找到最近的邻居。例如:
library(data.table)
library(FNN)
df1 <- fread("plz city lon lat
69115 Heidelberg 8.6934499740601 49.406078338623
44137 Dortmund 7.4582135 51.5143952
70178 Stuttgart 9.17115 48.77426
68159 Mannheim 8.4696736826668 49.491940248873
68167 Mannheim 8.4971965 49.5038859")
df2 <- fread("plz city lon lat
76530 Baden-Baden 8.2423068 48.7438178
89081 Ulm 9.961367 48.4253282
69120 Heidelberg 8.6752461 49.4225417
72076 Tübingen 9.0406256 48.5312051
74523 Schwäbisch-Hall 9.7424451 49.1247435")
nearest_neighbours <- get.knnx(df1[,.(lon,lat)],df2[,.(lon,lat)],k=1)
nearest_neighbours
对象包括两个列表,$nn.index
给出第二表中最近邻居的索引;以及CCD_ 11给出到第二表中最近邻居的欧几里得距离。
$nn.index
[,1]
[1,] 4
[2,] 3
[3,] 1
[4,] 3
[5,] 3
$nn.dist
[,1]
[1,] 0.78190978
[2,] 0.86382655
[3,] 0.02454431
[4,] 0.27588458
[5,] 0.67023636