我正在对一个非常大的光栅(437760000个单元格(进行后期处理,使用相同范围/cr的其他光栅层进行约束。大部分代码都能正常工作,但我遇到了一个问题。
r1[r2== 6 & r3>= 40 & r3<= 60] <- sample(2:4, length(r1[r2== 6 & r3>= 40 & r3 <= 60]), replace = T)
其中r1、r2和r3是唯一的光栅层。r1是基于约束来更新的,目的是改进映射。
此代码执行时没有任何问题,但在完成时抛出以下警告:
Warning message:
In .local(x, i, j = j, ..., value) :
the first replacement value is used for all cells
我想确保所有三个值都是随机选取的(最终我想使用sample中的prob参数来对其中一个值进行加权(。我尝试了许多修复程序,但它们都抛出了相同的警告消息,我认为这意味着三个值中只有一个在光栅上应用。我正为此在terra工作。
有什么想法吗?谢谢
这里有一个可重复的问题示例:
library(terra)
set.seed(123)
r1 <- rast(matrix(round(runif(400, 0, 100)), 20, 20))
plot(r1)
r2 <- rast(matrix(round(runif(400, 0, 10)), 20, 20))
r3 <- rast(matrix(round(runif(400, 30, 70)), 20, 20))
即使我无法重现您的警告代码,我认为您的问题在于您对这个调用的解释:r2== 6 & r3>= 40 & r3 <= 60
。这条线产生一个光栅:
r2== 6 & r3>= 40 & r3 <= 60
class : SpatRaster
dimensions : 20, 20, 1 (nrow, ncol, nlyr)
resolution : 0.05, 0.05 (x, y)
extent : 0, 1, 0, 1 (xmin, xmax, ymin, ymax)
coord. ref. :
source : memory
name : lyr.1
min value : 0
max value : 1
因此,调用r1[r2== 6 & r3>= 40 & r3 <= 60]
会产生一个数据帧:
str(r1[r2== 6 & r3>= 40 & r3 <= 60])
'data.frame': 17 obs. of 1 variable:
$ lyr.1: num 2 2 2 2 2 2 2 2 2 2 ...
您不希望这样,因为1列data.frame的length
=1,并且您不能用data.frame.进行值替换
试试这个:
pixel_to_change <- values(r2== 6 & r3>= 40 & r3<= 60) == 1
r1[pixel_to_change] <- sample(2:4, sum(pixel_to_change), replace = T)
这可能是你想要的。
这里有两个Bastien的替代(但相似(解决方案。他们避免使用values
,这对于非常大的数据集可能是有问题的。
library(terra)
set.seed(123)
r1 <- rast(matrix(round(runif(400, 0, 100)), 20, 20))
r2 <- rast(matrix(round(runif(400, 0, 10)), 20, 20))
r3 <- rast(matrix(round(runif(400, 30, 70)), 20, 20))
#1、使用lapp
x <- c(r1, r2, r3)
z <- lapp(x, function(r1, r2, r3) {
i <- r2== 6 & r3>= 40 & r3<= 60
r1[i] <- sample(2:4, sum(i), replace = T)
r1
})
#2,使用global
(而不是长度,取具有TRUE/FALSE值的光栅的全局和(
i <- r2== 6 & r3>= 40 & r3<= 60
n <- unlist(global(i, "sum"))
r1[i] <- sample(2:4, n, replace = T)