如何在R中按LatLong距离对数据进行分组

时间:2011-12-02 14:35:54

标签: r distance latitude-longitude

我有一个函数距离(lat1,lon1,lat2,lon2)来计算2点的距离。

假设我有一个包含一些点和值的数据框:

n<-c(lon = -1.729219, lat = 29.730836)
o<-c(lon = -5.041928, lat = 28.453022)
e<-c(lon = -2.700067, lat = 29.198922)
s<-c(lon = -5.212864, lat = 28.531739)
centro<-matrix(c(n,o,e,s), ncol=2, byrow=TRUE)
d<-data.frame(c=centro, amount=c(3.5,3.5,3.5,3.5), count=c(12,12,12,12))
colnames(d)<-c('lon','lat','amount','count')

我想得到一个新的框架集,其值聚合到最接近的一个(我不在乎)

假设我有一个10km的rad,n和o的距离为7,e和s距离任何其他点的距离为20,我期望一个具有3个值的新数据帧: e,s和一个带有金额的新值,并计算其他2和纬度和长度之和,或来自n的那些或来自o的那些。

我想在R中有一种简单的方法可以做到这一点,但我找不到它。

由于

2 个答案:

答案 0 :(得分:2)

我想如果你有点之间的距离,你可以使用hclust聚集点。然后使用cutree并设置h参数以在所需距离处剪切组。您可以使用这些组进行聚合。

也许这样的事情(我不知道输出是否正确,但是使用这些坐标可以得到数百公里的距离)

#Calculate the distances and name them
distance <- (distm(centro))
row.names(distance) <- c("n", "o", "e", "s")
colnames(distance) <- c("n", "o", "e", "s")
#Use agnes function because it accepts a matrix
#And convert it to hclust objet to use cutree
library(cluster)
clusters <- as.hclust(agnes(distance, diss = T))
d$group <- cutree(clusters, h = 210000)
#Finally use plyr to agregate
library(plyr)
ddply(d, .(group), 
      function(x) data.frame(lon = x$lon[1], lat = x$lat[1], 
                             amount = sum(x$amount), count = sum(x$count)))

HTH

答案 1 :(得分:1)

要计算地理坐标之间的距离,您可以使用sp包中的spDists函数。来自文档:

  

如果longlat = FALSE,则spDists在点的度量中返回一个完整的距离矩阵   公里如果longlat = TRUE;如果点是二维的,它使用spDistsN1。的情况下   spDists(x,x),它将计算所有n x n个距离,而不是足够的n x(n-1)

请注意,只有当您的对象由sp-package提供的空间类(在您的情况下为SpatialPointsDataFrame prob)表示时,此函数才有效。一个小R的例子:

library(sp)
data(meuse)
# Convert the data.frame meuse to SpatialPointsDataFrame
coordinates(meuse) = c("x","y")
spDists(meuse)

请注意,在您的情况下,您希望将spDists函数的输入参数longlat设置为TRUE以获得较大的圆距离。对于不太大的数据集,此函数可能正常工作。对于大型数据集,它可能会更慢。如果你真的需要快速的东西,你可以看看Rcpp用C ++编写循环。