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

Другие вопросы по тегам