在R中计算分区统计数据,就像在GIS中一样。

7
我有一个文件夹中有多个栅格图层。我需要从一个包含2500个多边形的矢量文件中提取每个栅格图层的平均值。
我找到了两个函数zonalextract。它说extract可以用于点、线和面。这是唯一的区别吗?(期望回答:是/否)
如何从这些多个栅格图层中提取平均值,并根据它们的文件名指定不同的列名称?
编辑:
我在某个地方找到了一段代码并实现了它。但是它一直没有进展,而且非常缓慢。
grids <- list.files("my_path", pattern = "*.tif$")

#check the number of files in the raster list (grids)
length <- length(grids)

#read-in the polygon shapefile
poly <- readShapePoly("my_path/supplimentY.shp")

#create a raster stack
s <- stack(paste0("my_path/", grids))

#extract raster cell count (sum) within each polygon area (poly)
for (i in 1:length(grids)){
  ex <- extract(s, poly, fun='mean', na.rm=TRUE, df=TRUE, weights = TRUE)
# the code doesnot progress from here onwards. 
# i checked it by adding this line:: print(i)

}

#write to a data frame
dfr <- data.frame(ex)
2个回答

8
您不需要循环(在每次迭代中重复相同的操作!)。
应该像这样:
library(terra)   
ff <- list.files("my_path", pattern = "\\.tif$", full=TRUE)
s <- rast(ff)

poly <- vect("my_path/supplimentY.shp")
ex <- extract(s, poly, fun='mean', na.rm=TRUE)
#or  ex <- extract(s, poly, fun='mean', na.rm=TRUE, exact=TRUE)

你也可以使用 terra::zonal
使用(现已过时的)"raster"包,你可以这样做:
library(raster)   
ff <- list.files("my_path", pattern = "\\.tif$", full=TRUE)
s <- stack(ff)
poly <- shapefile("my_path/supplimentY.shp")
ex <- extract(s, poly, fun='mean', na.rm=TRUE, df=TRUE, weights = TRUE)

我已经堆叠了15个栅格,并按照您的建议运行了代码。这需要很长时间,我不知道里面发生了什么,R一直很忙。Shapefile有2796个多边形。在QGIS中完成相同的操作通常需要每个栅格2分钟。提取函数需要这么长时间是正常的吗?我认为R应该更快。 - anup
你读了我的评论吗?以及我针对此问题的疑问 https://stackoverflow.com/questions/50006421/calculate-zonal-statistics-in-r-using-extract-function-of-raster-package - anup
它很慢。下一个版本的光栅(目前正在CRAN批准管道中)应该会显著提高速度。 - Robert Hijmans
2
你可以尝试使用 exactextract 进行更快速的计算 https://github.com/isciences/exactextractr - atsyplenkov
1
是的,或者 terra::zonal 或者 terra::extract - Robert Hijmans

-1

我使用了相同的代码来计算一个区域边界的气候学分区平均值,处理2736层栅格数据花费了我5-6分钟。

    layers <- length(clim)
        for (i in 1:length(clim)) {
     ex <- extract(clim, shpwb, fun=mean, na.rm=TRUE, df=TRUE)
     }

     df <- data.frame(ex)

     write.csv(df, file = "E:/Central University of Jharkhand/3rd Semester/Climatology/R Studio/CSV.csv")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接