Получить сумму значений поля на расстоянии с помощью простых функций (SF) - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь получить сумму значений из поля объекта 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 Ответ

0 голосов
/ 04 декабря 2018

Мы можем сделать следующее:

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

...