在R中,如何在空间网格方格上平均空间点数据

时间:2014-07-11 16:29:55

标签: r spatial

管理现在解决问题

我有一组大约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])))])
}

我现在的问题是,这是最好的方法,还是有更有效的方式?

1 个答案:

答案 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)