【问题标题】:how to group data by LatLong distance in R如何在R中按LatLong距离对数据进行分组
【发布时间】:2011-12-02 14:35:53
【问题描述】:

我有一个函数 distance(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')

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

假设我的 rad 为 10 公里,n 和 o 的距离为 7,e 和 s 与任何其他点的距离为 20,我期望一个具有 3 个值的新数据框: e、s 和一个带有数量的新值,并计算其他 2 和 lat 和 long 的总和,无论是来自 n 的还是来自 o 的。

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

谢谢

【问题讨论】:

  • 您能否提供场景的预期输出?我不清楚你在说什么。
  • 您关心“大圆”距离还是这些点足够接近以使用欧几里得距离?

标签: r distance latitude-longitude


【解决方案1】:

我想如果你有点之间的距离,你可以使用 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

【讨论】:

  • 查看R包geosphere,它有几个距离计算功能。
【解决方案2】:

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

spDists 如果 longlat=FALSE 或在 公里,如果 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++ 中编写循环。

【讨论】:

  • 感谢您的回答保罗!现在我意识到我可以只使用四舍五入的小数,这会自动对它们进行聚类:D 这并不准确,因为纬度/经度和公里之间的关系在地球的不同点上有所不同,但对于我正在尝试做的事情,现在还可以.
  • 很高兴你喜欢这个答案:)。如果您喜欢这些答案,您可以选择一个作为正确答案,方法是在数字下方的灰色刻度上用上下投票三角形打勾。此外,对答案进行投票将感谢受访者为回答您的问题所付出的努力。
猜你喜欢
  • 2017-10-21
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
  • 2021-11-04
  • 2014-12-23
  • 2015-01-06
相关资源
最近更新 更多