агрегировать sf точки в зависимости от расстояния - PullRequest
2 голосов
/ 12 марта 2019

Я хотел бы создать средние значения всех переменных SpatialPointsDataFrame, когда точки находятся в пределах указанного расстояния.У меня есть способ сделать это, но это кажется глупым способом решения проблемы.Любые идеи сделать это с использованием современного синтаксиса аккуратного разнообразия будут оценены.

Для начала у меня есть SpatialPointsDataFrame с несколькими переменными, измеренными для каждой точки.Я хотел бы получить среднее значение всех переменных для точек на указанном расстоянии.Например, получение средних значений кадмия из данных meuse для точек в пределах 100 м друг от друга:

library(sf)
library(sp)
data(meuse)
pts <- st_as_sf(meuse, coords = c("x", "y"),remove=FALSE)
pts100 <- st_is_within_distance(pts, dist = 100)
# can use sapply to get mean of a variable. E.g., cadmium
sapply(pts100, function(x){ mean(pts$cadmium[x]) })

Итак, я выяснил, как использовать sapply, чтобы сделать эту переменную переменной.Таким образом, я мог бы, если бы захотел, рассчитать среднее значение для каждой переменной, сгенерировать центроид для каждой точки и затем SpatialPointsDataFrame уникальных значений.Например, для первых нескольких переменных:

res <- data.frame(id=1:length(pts100),
                  x=NA, y=NA,
                  cadmium=NA, copper=NA, lead=NA)
res$x <- sapply(pts100, function(p){ mean(pts$x[p]) })
res$y <- sapply(pts100, function(p){ mean(pts$y[p]) })
res$cadmium <- sapply(pts100, function(p){ mean(pts$cadmium[p]) })
res$copper <- sapply(pts100, function(p){ mean(pts$copper[p]) })
res$lead <- sapply(pts100, function(p){ mean(pts$lead[p]) })
res2 <- res[duplicated(res$cadmium),]
coordinates(res2) <- c("x","y")
bubble(res2,"cadmium")

Это работает, но кажется громоздким и, как должно быть, более эффективный способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...