在R中使用条件

时间:2018-04-17 17:37:40

标签: r image-processing gis r-modis

我有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 [,])

这部分不起作用。

有人可以帮助我吗?

1 个答案:

答案 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 )