管理现在解决问题
我有一组大约5万个点,它们具有坐标和一个与之相关的值。我希望能够将点放入网格中,平均所有落入网格方格的点的相关值。所以我希望最终得到一个识别每个网格方块的对象,并给出网格平方内的平均值。
如果有帮助,我在空间点数据框和空间网格对象中有数据。
改善答案:我肯定已经做了一些搜索,对于问题的初始状态感到抱歉,我只能设法在我自己的脑海中构建问题;在......之前没有必要把它传达给其他人。
以下是希望更清楚地说明问题的示例数据
##make some data
longi <- runif(100,0,10)
lati <- runif(100,0,10)
value <- runif(500,20,30)
##put in data frame then change to spatial data frame
df <- data.frame("lon"=longi,"lat"=lati,"val"=value)
coordinates(df) <- c("lon","lat")
proj4string(df) <- CRS("+proj=longlat")
##create a grid that bounds the data
grd <- GridTopology(cellcentre.offset=bbox(df)[,1],
cellsize=c(1,1),cells.dim=c(11,11))
sg <- SpatialGrid(grd)
然后我希望得到一个对象,尽管是一个矢量/数据帧/列表,它给出了每个网格单元/平方的平均值,以及识别它是哪个单元的某种方式。
解决方案
##convert the grid into a polygon##
polys <- as.SpatialPolygons.GridTopology(grd)
proj4string(polys) <- CRS("+proj=longlat")
##can now use the function over to select the correct points and average them
results <- rep(0, length(polys))
for(i in 1:length(polys)) {
results[i] = mean(df$val[which(!is.na(over(x=df,y=polys[i])))])
}
我现在的问题是,这是最好的方法,还是有更有效的方式?
答案 0 :(得分:2)
您的说明充其量是模糊的。请尝试优先询问更具体的答案,并使用代码说明您已经尝试过的内容。平均点数据或单个栅格单元中的单个值绝对没有意义。
我可以提供的答案的最佳猜测是使用栅格提取()将栅格值分配给sp点对象,然后使用tapply()将值聚合到点中的分组值。您可以使用点的坐标来标识单元格位置,或者交替使用从提取返回的单元格数字(以下示例)。
require(raster)
require(sp)
# Create example data
r <- raster(ncol=500, nrow=500)
r[] <- runif(ncell(r))
pts <- sampleRandom(r, 100, sp=TRUE)
# Add a grouping value to points
pts@data <- data.frame(ID=rownames(pts@data), group=c( rep(1,25),rep(2,25),
rep(3,25),rep(4,25)) )
# Extract raster values and add to @data slot dataframe. Note, the "cells"
# attribute indicates the cell index in the raster.
pts@data <- data.frame(pts@data, extract(r, pts, cellnumbers=TRUE))
head(pts@data)
# Use tapply to cal group means
tapply(pts@data$layer, pts@data$group, FUN=mean)