我有一个二进制堆叠的 SpatRaster bstacked_fht,其 25 层对应于不同森林栖息地类型的存在/不存在数据。我不想只有值 0 和 1,而是仅当值为 0.25 时才将值 1 替换为另一个 SpatRaster vit_dec 的相应像素。换句话说,仅当 bstacked_fht[[i]] = 1 且 vit_dec = 0.25 时才替换值。两层也都有 NULL 值。
print(bstacked_fht)
# class : SpatRaster
# dimensions : 2370, 2513, 25 (nrow, ncol, nlyr)
# resolution : 100, 100 (x, y)
# extent : 280329.8, 531629.8, 5578461, 5815461 (xmin, xmax, ymin, ymax)
# coord. ref. : ETRS89 / UTM zone 32N (EPSG:25832)
# sources : spat_nx7E84x54c8tnTN_24884.tif
# spat_nx7E84x54c8tnTN_24884.tif (17 layers)
# spat_nx7E84x54c8tnTN_24884.tif (7 layers)
# names : class_1, class_3, class_4, class_5, class_6, class_7, ...
# min values : 0, 0, 0, 0, 0, 0, ...
# max values : 1, 1, 1, 1, 1, 1, ...
freq(bstacked_fht)
# layer value count
# 1 1 0 91763
# 2 1 1 524
# 3 2 0 88677
# 4 2 1 3610
# 5 3 0 92281
# 6 3 1 6
# 7 4 0 92281
# 8 4 1 6
# 9 5 0 91933
# 10 5 1 354
# 11 6 0 80878
# 12 6 1 11409
# 13 7 0 92106
# 14 7 1 181
# 15 8 0 89741
# 16 8 1 2546
# 17 9 0 92268
# 18 9 1 19
# 19 10 0 90569
# 20 10 1 1718
# 21 11 0 92245
# 22 11 1 42
# 23 12 0 92141
# 24 12 1 146
# 25 13 0 55803
# 26 13 1 36484
# 27 14 0 92280
# 28 14 1 7
# 29 15 0 69071
# 30 15 1 23216
# 31 16 0 91796
# 32 16 1 491
# 33 17 0 85216
# 34 17 1 7071
# 35 18 0 92105
# 36 18 1 182
# 37 19 0 91956
# 38 19 1 331
# 39 20 0 89634
# 40 20 1 2653
# 41 21 0 91160
# 42 21 1 1127
# 43 22 0 92286
# 44 22 1 1
# 45 23 0 92131
# 46 23 1 156
# 47 24 0 92282
# 48 24 1 5
# 49 25 0 92285
# 50 25 1 2
print(vit_dec)
# class : SpatRaster
# dimensions : 2370, 2513, 1 (nrow, ncol, nlyr)
# resolution : 100, 100 (x, y)
# extent : 280329.8, 531629.8, 5578461, 5815461 (xmin, xmax, ymin, ymax)
# coord. ref. : ETRS89 / UTM zone 32N (EPSG:25832)
# source(s) : memory
# name : vitality_highly_decreased_25832
# min value : 0.00
# max value : 0.25
freq(vit_dec)
# layer value count
# 1 1 0 186034
我尝试过各种方法但没有成功。比如:
function(bstacked_fht, vit_dec, thresh = 0.5, vit_dec_thresh = 0.20) {
result <- list()
for (i in 1:25) {
layer <- bstacked_fht[[i]]
higher <- layer > thresh & vit_layer > vit_dec_thresh
layer[higher] <- vit_layer[higher]
result[[i]] <- layer
}
names(result) <- names(bstacked_fht)
return(result)
}
或
for (i in 1:25) {
a_layer <- bstacked_fht[[i]]
a_layer[] <- ifelse(a_layer[] > 0.5 & vit_dec[] > 0.2, vit_dec[], a_layer[])
bstacked_fht[[i]] <- a_layer
}
这在仅可能有二进制值的二进制堆叠栅格中可能不可行。我的想法快用完了。 您对如何做有什么建议吗?我应该将 bstacked_fht 转换为另一种类型的对象吗?
没有您的数据,但也许
mask
就是您正在寻找的
library(terra)
set.seed(42)
present = array(sample(c(0,1), 216L, replace = TRUE), dim = c(6,6,6))
present_r = rast(present)
sick = rast(matrix(sample(c(0, 0.25), 36L, replace = TRUE, prob=c(0.97, 0.03)), ncol =6)) #prob approx your present/sick
#plot(sick) - just to check we got one or so cells under sample probs
present_r_masked = mask(present_r, sick, maskvalues = 0.25, updatevalue = 0.25)
也许吧。