使用R对连接的一组点(经度,纬度)进行聚类

时间:2014-11-18 08:30:14

标签: r google-maps latitude-longitude

我正在处理居中的经度(x)和纬度(y)数据。我的目标是聚集连接的位置。

如果earth_distance((x1,y1),(x2,y2))<15公里,地球上的两个位置(x1,y1)和(x2,y2)被称为连接。

我在R中使用distHaversine函数来计算地球距离。

以下是一些示例数据

  

x = c(1.000000,1.055672,1.038712,1.094459,1.133179,1.116241,1.126053,1.181824,1.377892,5.869881,5.925270,5.909721)

  

Y = C(1.333368,1.304790,1.347332,1.318743,1.332676,1.375229,1.572287,1.544174,2.371105,2.337032,2.383415)

  

距离&lt; - distHaversine(c(x,y))

我希望找到由不同连接点组成的不同聚类(每个连接的点组形成一个聚类)。

我看了How to cluster points and plot,但我无法解决问题。

非常感谢任何参考,建议或答案。

1 个答案:

答案 0 :(得分:2)

也许这个。首先制作一些坐标:

> x=c(1.000000, 1.055672, 1.038712, 1.094459, 1.133179, 1.116241, 1.126053, 1.181824 ,1.377892, 5.869881, 5.925270)
> y=c(1.333368, 1.304790, 1.347332, 1.318743, 1.332676, 1.375229, 1.572287, 1.544174, 2.371105 ,2.337032, 2.383415)

制作数据框

> xy = data.frame(x=x,y=y)

现在使用outer循环遍历所有行和列对以计算全距离矩阵。这是真正必要的工作量的两倍,因为它为所有ij计算jiij。无论如何,它给我们一个距离矩阵:

> dmat = outer(1:nrow(xy), 1:nrow(xy), function(i,j)distHaversine(xy[i,],xy[j,]))

现在我们需要一个连接矩阵,它是一个距离小于15,000米的对:

> cmat = dmat < 15000

现在我们使用igraph包来构建连接图对象:

> require(igraph)
> cgraph = graph.adjacency(cmat)

您可以绘制此图以查看群集形成,但请注意,这些不会在您的x-y空间中绘制:

> plot(cgraph)

现在获取连接的群集:

> clusters(cgraph)
$membership
 [1] 1 1 1 1 1 1 2 2 3 4 4

$csize
[1] 6 2 1 2

$no
[1] 4

您可以将其添加到数据框中:

> xy$cluster = clusters(cgraph)$membership
> xy
          x        y cluster
1  1.000000 1.333368       1
2  1.055672 1.304790       1
3  1.038712 1.347332       1
4  1.094459 1.318743       1
5  1.133179 1.332676       1
6  1.116241 1.375229       1
7  1.126053 1.572287       2
8  1.181824 1.544174       2
9  1.377892 2.371105       3
10 5.869881 2.337032       4
11 5.925270 2.383415       4

情节:

> plot(xy$x,xy$y,col=xy$cluster)