我有3个栅格,我想在表达式中使用它们,但我可以在3个栅格中找到不同的 na 值。例如:我可以拥有2个栅格中的值,但是在3个中我有 na ,那么在这种情况下我无法应用我的表达式。
按照我的代码:
for(i in 1:length(name_BSA)){
i <- 1
if(days_BSA[i] == days_WSA[i] & days_WSA[i] == days_FDS[i]){
BSA <- raster(list_BSA[i])
WSA <- raster(list_WSA[i])
FDS <- raster(list_FDS[i])
brick <- brick(BSA, WSA, FDS)
if(!is.na(BSA[,]) & !is.na(WSA[,]) & !is.na(FDS[,])){
BLSA <- ((1-FDS[i])*BSA[i]) + (FDS[i] * WSA[i])
}
name_BLSA <- paste0("BLSA_",days_BSA[i])
writeRaster(BLSA, file.path(main,output_folder, name_BLSA), format = "GTiff", overwrite = T)
}
}
我的问题是这部分:!is.na(BSA [,])&amp; !is.na(WSA [,])&amp; !is.na(FDS [,])
这部分不起作用。
有人可以帮助我吗?
答案 0 :(得分:0)
如果您提供了一些代码生成的示例数据,并且省略了诸如for循环和if子句之类的不相关细节,那么帮助会更容易。
就我所见,没有必要使用!is.na
。如果其中一个值为NA
,则结果也为NA
。我认为这是你想要的,虽然你没有else
条款。您不应该使用算术运算在RasterLayers上使用索引。您也可以在不使用它的情况下创建RasterBrick。
library(raster)
# example data
output_folder = "."
f <- system.file("external/rlogo.grd", package="raster")
BSA <- raster(f, 1)
WSA <- raster(f, 2)
FDS <- raster(f, 3)
# improved code
BLSA <- (1-FDS)*BSA + FDS * WSA
name_BLSA <- file.path(output_folder, paste0("BLSA_", ".tif"))
writeRaster(BLSA, name_BLSA, overwrite = TRUE)
或者,您可以
BLSA <- overlay(FDS, BSA, WSA, fun=function(x,y,z) { (1-x)*y + x*z }, filename=name_BLSA )