基于来自r中的distHaversine的long / lat的半径的Sum列

时间:2017-04-19 15:42:55

标签: r haversine

SO question

的延续

我有一个非常大的Shortcomings of subnetting with classful addresses.,并希望对半径范围内的每个df / value的列lat求和。

long

有没有RAM有效的方法呢?

原帖提示如下计算半径范围内的事件,我想知道我是否可以用类似的方式对列进行求和?

set.seed(1)
radius<-10000 # In meters
lat<-runif(10,-90,90)
long<-runif(10,-180,180)
value<- runif(10,200,7000)
id<-1:10
dat<-cbind(id,lat,long, value)

2 个答案:

答案 0 :(得分:0)

朴素的方式:

m <- distm(dat[, 3:2], fun = distHaversine) <= 1000*radius
X <- rowSums(m)
Y <- colSums(value * m)

cbind(dat, X, Y)
#       id       lat         long     value X         Y
#  [1,]  1 -42.20844 -105.8491530 6555.9956 5 18843.936
#  [2,]  2 -23.01770 -116.4395691 1642.5691 5 19627.074
#  [3,]  3  13.11361   67.3282248 4631.3816 5 10818.887
#  [4,]  4  73.47740  -41.7226614 1053.7747 6 17715.922
#  [5,]  5 -53.69725   97.1429112 2017.1005 4 15718.851
#  [6,]  6  71.71014   -0.8282728 2825.5758 6 17715.922
#  [7,]  7  80.04155   78.3426630  291.0543 6 17715.922
#  [8,]  8  28.94360  177.0861941 2800.2381 5  8613.212
#  [9,]  9  23.24053  -43.1873354 6113.8978 6 18482.867
# [10,] 10 -78.87847   99.8802797 2514.3732 4 12730.038

但如果您的数据非常大,则无法正常工作。在这种情况下,您将不得不避免计算所有距离。 This article可能是一个很好的阅读。

答案 1 :(得分:0)

我在下面添加了使用spatialrisk软件包的解决方案。此软件包中的关键功能是用C ++(Rcpp)编写的,因此非常快。

首先,加载数据:

set.seed(1)
radius<-10000 # In meters
lat<-runif(10,-90,90)
long<-runif(10,-180,180)
value<- runif(10,200,7000)
id<-1:10
dat<-data.frame(id,lat,long, value)

然后:

spatialrisk::concentration(sub = dat, full = dat, 
                           value = value, lon_sub = long, 
                           lon_full = long, radius = 10000)

    id       lat         long     value concentration
 1   1 -42.20844 -105.8491530 6555.9956     6555.9956
 2   2 -23.01770 -116.4395691 1642.5691     1642.5691
 3   3  13.11361   67.3282248 4631.3816     4631.3816
 4   4  73.47740  -41.7226614 1053.7747     1053.7747
 5   5 -53.69725   97.1429112 2017.1005     2017.1005
 6   6  71.71014   -0.8282728 2825.5758     2825.5758
 7   7  80.04155   78.3426630  291.0543      291.0543
 8   8  28.94360  177.0861941 2800.2381     2800.2381
 9   9  23.24053  -43.1873354 6113.8978     6113.8978
 10 10 -78.87847   99.8802797 2514.3732     2514.3732