区域统计以获得 R 中每个多边形的多数像素值?
Zonal statistics to get majority pixel value per polygon in R?
实际上,我尝试使用 SpatialPolygonsDataFrame 从栅格中计算主要像素值。这是我发现的一些代码,可能会引导正确的方向:
library(raster)
# Create interger class raster
r <- raster(ncol=36, nrow=18)
r[] <- round(runif(ncell(r),1,10),digits=0)
r[]<-as.integer(r[])
# Create two polygons
cds1 <- rbind(c(-180,-20), c(-160,5), c(-60, 0), c(-160,-60), c(-180,-20))
cds2 <- rbind(c(80,0), c(100,60), c(120,0), c(120,-55), c(80,0))
polys <- SpatialPolygonsDataFrame(SpatialPolygons(list(Polygons(list(Polygon(cds1)), 1),
Polygons(list(Polygon(cds2)),2))),data.frame(ID=c(1,2)))
# Extract raster values to polygons
( v <- extract(r, polys) )
# Get class counts for each polygon
v.counts <-lapply(v,table)
到目前为止一切都很好,但我真的坚持要提取计数最高的列的列名。
我试过类似的东西:
v.max<- lapply(v.counts,max)
但是列信息丢失了。之后:
v.max<- lapply(v.counts, max.col)
结果我只得到“1”。
如果有人能给我提示我做错了什么,我将不胜感激。还有另一种方法可以提取多边形中的主要像素值吗?
which.max()
是你的朋友。由于您只需要名称,请使用 names()
.
sapply(v.counts, function(x) names(x)[which.max(x)])
# [1] "9" "5"
注: set.seed(42)
exactextractr
package can do this trick. It computes zonal statistics even faster than terra
in some cases. See comparison here
library(exactextractr)
exact_extract(r, polys, 'majority')
#> Warning in .exact_extract(x, sf::st_as_sf(y), ...): No CRS specified for
#> polygons; assuming they have the same CRS as the raster.
#> |======================================================================| 100%
#> [1] 4 2
您可以使用modal
函数
v <- extract(r, polys, modal)
实际上,我尝试使用 SpatialPolygonsDataFrame 从栅格中计算主要像素值。这是我发现的一些代码,可能会引导正确的方向:
library(raster)
# Create interger class raster
r <- raster(ncol=36, nrow=18)
r[] <- round(runif(ncell(r),1,10),digits=0)
r[]<-as.integer(r[])
# Create two polygons
cds1 <- rbind(c(-180,-20), c(-160,5), c(-60, 0), c(-160,-60), c(-180,-20))
cds2 <- rbind(c(80,0), c(100,60), c(120,0), c(120,-55), c(80,0))
polys <- SpatialPolygonsDataFrame(SpatialPolygons(list(Polygons(list(Polygon(cds1)), 1),
Polygons(list(Polygon(cds2)),2))),data.frame(ID=c(1,2)))
# Extract raster values to polygons
( v <- extract(r, polys) )
# Get class counts for each polygon
v.counts <-lapply(v,table)
到目前为止一切都很好,但我真的坚持要提取计数最高的列的列名。
我试过类似的东西:
v.max<- lapply(v.counts,max)
但是列信息丢失了。之后:
v.max<- lapply(v.counts, max.col)
结果我只得到“1”。
如果有人能给我提示我做错了什么,我将不胜感激。还有另一种方法可以提取多边形中的主要像素值吗?
which.max()
是你的朋友。由于您只需要名称,请使用 names()
.
sapply(v.counts, function(x) names(x)[which.max(x)])
# [1] "9" "5"
注: set.seed(42)
exactextractr
package can do this trick. It computes zonal statistics even faster than terra
in some cases. See comparison here
library(exactextractr)
exact_extract(r, polys, 'majority')
#> Warning in .exact_extract(x, sf::st_as_sf(y), ...): No CRS specified for
#> polygons; assuming they have the same CRS as the raster.
#> |======================================================================| 100%
#> [1] 4 2
您可以使用modal
函数
v <- extract(r, polys, modal)