Получить сумму значений поля на расстоянии с помощью простых функций (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 и хотел бы узнать, как это сделать.
1 ответ
Мы можем сделать следующее:
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
возвращает вектор, и мы остаемся с созданием фрейма данных или матрицы для результатов.