我想创建一个SpatialPointsDataFrame变量的平均值,当点在特定距离内时。我有一种方法可以做到这一点,但似乎是一种愚蠢的方式来解决这个问题。欢迎使用现代语法(如“整洁”的语法)的任何想法来实现此目标。
首先,我有一个SpatialPointsDataFrame,其中包含每个点测量的几个变量。我想获取所有点中指定距离内变量的平均值。例如,从"meuse"数据中获取距离彼此100米内的平均镉值:
那么,我已经明白了如何使用
首先,我有一个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")
这种方法虽然可行,但似乎有些繁琐,而且可能存在更高效的方式。