【发布时间】:2019-12-01 08:47:12
【问题描述】:
我有 2500 个栅格数据,每个栅格可以包含 1 层或 2 层或 3 层。问题是需要选择每个栅格的最佳图层(该图层包含最小 NA 值),我想为此目的使用 R。样本数据(包含 4 个栅格文件)上传here: 第一步,我想从仅包含 3 个图层的栅格文件中选择最佳图层。 我使用此代码:
list_files <- list.files(pattern = ".tif")
file_name <- paste0("best_layer" , list_files)
library(raster)
for(i in 1:length(list_files)){
r <- stack(list_files[i])
len <- nlayers(r)
if(len!=3)
next
r_1 <- sum(is.na(as.matrix(r[[1]])))
r_2 <- sum(is.na(as.matrix(r[[2]])))
r_3 <- sum(is.na(as.matrix(r[[3]])))
ifelse((r_1 < r_2 & r_1 < r_3),print("layer1"),
ifelse((r_2 < r_1 & r_2 < r_3)
,print("layer_2")
,print("layer_3")))
}
结果是:
[1] "layer_1"
[1] "layer_1"
[1] "layer_2"
[1] "layer_2"
但是当我更改 ifelse 以编写最佳栅格图层时,喜欢此代码:
for(i in 1:length(list_files)){
r <- stack(list_files[i])
len <- nlayers(r)
if(len!=3)
next
r_1 <- sum(is.na(as.matrix(r[[1]])))
r_2 <- sum(is.na(as.matrix(r[[2]])))
r_3 <- sum(is.na(as.matrix(r[[3]])))
ifelse((r_1 < r_2 & r_1 < r_3),writeRaster(x = r[[1]], filename = file_name[i], format = 'GTiff'),
ifelse((r_2 < r_1 & r_2 < r_3)
,writeRaster(x = r[[2]], filename = file_name[i], format = 'GTiff')
,writeRaster(x = r[[3]], filename = file_name[i], format = 'GTiff')))
}
我希望 R 创建 4 个具有最佳层的 tiff 文件,但 R 只创建了第一个文件并给了我这个错误:
rep 中的错误(是,length.out = len): 尝试复制“S4”类型的对象
我该如何解决这个错误??? 谢谢。
【问题讨论】: