我有一个非常大的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)
答案 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