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


person Tnunes    schedule 03.12.2018    source источник


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

person Julius Vainora    schedule 03.12.2018
comment
Большой! Спасибо! Именно так! (просто нужно было вычесть значение самой точки, но отлично работало) - person Tnunes; 04.12.2018