我正在处理居中的经度(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,但我无法解决问题。
非常感谢任何参考,建议或答案。
答案 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
循环遍历所有行和列对以计算全距离矩阵。这是真正必要的工作量的两倍,因为它为所有i
和j
计算j
到i
和i
到j
。无论如何,它给我们一个距离矩阵:
> 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)