【问题标题】:how to fix this error "Error in rep(yes, length.out = len) : attempt to replicate an object of type 'S4'"如何修复此错误“rep 中的错误(是,length.out = len):尝试复制 'S4' 类型的对象”
【发布时间】: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”类型的对象

我该如何解决这个错误??? 谢谢。

【问题讨论】:

    标签: r r-raster rgdal


    【解决方案1】:

    我认为问题可能在于您使用的是矢量化函数 (ifelse),而您实际上需要普通的旧 if ... else。或者,更好的是i &lt;- which.min(c(r_1, r_2, r_3)),而您根本不需要if

    rv <- sapply(r, function(rj) sum(is.na(as.matrix(rj))))
    ind <- which.min(rv)
    writeRaster(x = r[[ind]], filename = file_name[i], format = 'GTiff')
    

    解释:在 1..3 中运行 j 的命令后,sapply 返回一个由三个数字组成的向量,rv。然后,which.min 返回该向量中最小值的位置。要使代码更明确一点,请执行以下操作:

    count.nas <- function(rj) sum(is.na(as.matrix(rj)))
    rv <- sapply(r, count.nas)
    ind <- which.min(rv)
    writeRaster(x = r[[ind]], filename = file_name[i], format = 'GTiff')
    

    由于我没有minimal reproducible example,所以我没有检查此代码。

    【讨论】:

      【解决方案2】:

      我认为这是一种更好地了解你所追求的方法

      示例数据

      library(raster)
      f <- system.file("external/rlogo.grd", package="raster")
      b <- brick(f)
      b[[1]][1:12] <- NA
      b[[2]][5:10] <- NA
      b[[3]][1:10] <- NA
      

      寻找最佳层的功能

      fun <- function(x){
          if (nlayers(x) > 1) {
              cnt <- freq(x, value=NA)
              which.min(cnt)
          } else {
              -1
          }
      }
      

      使用功能

      fun(b)
      

      然后可能是这样的:

      for (i in 1:length(list_files)) {
         b <- brick(list_files[i])   
         j <- fun(b)
         if (j > 0) {
           writeRaster(b[[j]], file_name[i])
         }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-01-24
        • 2021-06-29
        • 2013-07-17
        • 1970-01-01
        • 1970-01-01
        • 2018-11-01
        • 1970-01-01
        • 2018-07-27
        • 1970-01-01
        相关资源
        最近更新 更多