R语言 如何更改栅格格网像元值的比例

yzxexxkh  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(155)

在示例栅格r中,如何将像素值84的比例从9%更改为25%,如per_84所示?即,我希望增加像素值为84的像素数,并根据以下条件减少像素值为其他值的像素数。
84的比例从9%25%的增加如下:9%(属于84)已经在光栅中。在剩余的16%中,6%来自像素值905%来自像素值85,并且剩余的5%来自像素值80

set.seed(200)
r <- raster(ncol=10,nrow=20)
r[] <- sample(80:90, 200, replace=T)    
plot(r)   
getValues(r)
no_cell_val84 <- cellStats(r,function(x,...) sum(x==84)) 
no_cell_val84

no_grid_cell <- ncell(r)
no_grid_cell

per_84 <- (no_cell_val84/no_grid_cell)*100
per_84
sbdsn5lh

sbdsn5lh1#

此处使用"terra"(替换"raster"包)
示例数据

library(terra)
set.seed(200)
r <- rast(ncol=10,nrow=20)
values(r) <- sample(80:90, 200, replace=TRUE)
r[13:14,] <- NA

值为v的像元数(84)

v <- 84
nv <- global(r==v, sum, na.rm=TRUE)[[1]] 
nv 
#[1] 18

我们需要添加多少细胞?

nc <- ncell(r)
add <- (0.25 * nc) - nv
add 
#[1] 32

从大于add的样本开始,因为我们需要删除已经是84的单元格。

i <- sample(nc, 2*add)
rv <- r[i]
# remove cells that have value v
i <- i[-which(rv == v)]
# subset to the number we need
if (length(i) >= add) {
   i <- i[1:add]
} else {
   print("the sample is too small")
}
head(i)
#[1]  60  88  39  22 146  10

现在更新值并验证。

r[i] <- v

global(r==v, sum, na.rm=TRUE)[[1]] 
#[1] 50

相关问题