获取具有简单特征的距离内的字段值总和 (sf)
Get sum of field values within distance with simple features (sf)
我正在尝试从 sf 对象的字段中获取到每个点的给定距离内的所有点的值总和,不包括该点的值。
set.seed(123);m=matrix(runif(30,1,40),ncol=3)
loc<-m %>%
as.data.frame %>%
sf::st_as_sf(coords = c(1,2))
a<-st_is_within_distance(loc,dist=10)
> a
Sparse geometry binary predicate list of length 10, where the predicate was `is_within_distance'
1: 1, 6, 10
2: 2, 4
3: 3
4: 2, 4
5: 5, 8
6: 1, 6
7: 7, 9
8: 5, 8
9: 7, 9
10: 1, 10
我们怎样才能得到一个数据框,其中包含这 10 个点的列表以及 V3 的总和?
point|sum
1 | sum_of_v3_of(6,10)
2 | sum_of_v3_of(4)
...
使用 postgis 很容易做到这一点,但所有其他代码都在 R 中,我想学习如何做。
我们可能会做以下事情:
data.frame(point = 1:length(a), sum = sapply(a, function(p) sum(loc$V3[p])) - loc$V3)
# point sum
# 1 1 35.37012
# 2 2 39.77652
# 3 3 0.00000
# 4 4 28.01933
# 5 5 24.17154
# 6 6 35.69203
# 7 7 12.27723
# 8 8 26.57253
# 9 9 22.21857
# 10 10 35.69203
一旦我们注意到 a
是一个列表(参见 str(a)
),它的第一个元素是 1、6、10,a[[1]]
,这就变得容易了loc
也是一个包含元素 V3
的列表,可以通过 loc$V3
访问该元素。因此,然后使用 sapply
我们遍历 a
的元素,查看 loc$V3
的相应元素并将它们相加。结果 sapply
returns 一个向量,我们剩下的就是为结果创建数据框或矩阵。
我正在尝试从 sf 对象的字段中获取到每个点的给定距离内的所有点的值总和,不包括该点的值。
set.seed(123);m=matrix(runif(30,1,40),ncol=3)
loc<-m %>%
as.data.frame %>%
sf::st_as_sf(coords = c(1,2))
a<-st_is_within_distance(loc,dist=10)
> a
Sparse geometry binary predicate list of length 10, where the predicate was `is_within_distance'
1: 1, 6, 10
2: 2, 4
3: 3
4: 2, 4
5: 5, 8
6: 1, 6
7: 7, 9
8: 5, 8
9: 7, 9
10: 1, 10
我们怎样才能得到一个数据框,其中包含这 10 个点的列表以及 V3 的总和?
point|sum
1 | sum_of_v3_of(6,10)
2 | sum_of_v3_of(4)
...
使用 postgis 很容易做到这一点,但所有其他代码都在 R 中,我想学习如何做。
我们可能会做以下事情:
data.frame(point = 1:length(a), sum = sapply(a, function(p) sum(loc$V3[p])) - loc$V3)
# point sum
# 1 1 35.37012
# 2 2 39.77652
# 3 3 0.00000
# 4 4 28.01933
# 5 5 24.17154
# 6 6 35.69203
# 7 7 12.27723
# 8 8 26.57253
# 9 9 22.21857
# 10 10 35.69203
一旦我们注意到 a
是一个列表(参见 str(a)
),它的第一个元素是 1、6、10,a[[1]]
,这就变得容易了loc
也是一个包含元素 V3
的列表,可以通过 loc$V3
访问该元素。因此,然后使用 sapply
我们遍历 a
的元素,查看 loc$V3
的相应元素并将它们相加。结果 sapply
returns 一个向量,我们剩下的就是为结果创建数据框或矩阵。