多个嵌套循环仅在R中的i = j = k索引下进行迭代

问题描述 投票:0回答:2

我一直在尝试计算三个满足R条件(在Windows 10和R版本3.6.3中)的光栅文件的像素数。这个想法是使用这三个图像(经过预处理),并在以下代码的if语句中计算满足条件的像素数量。

library(rgdal)
library(raster)  

mydir<- file.path("D:/files")
    setwd(mydir)

    listado1 <- list.files(pattern="crNDVI*")
    listado2 <- list.files(pattern="crNBR*")
    listado3 <- list.files(pattern="dNBR*")

    df <- data.frame(NULL)


    for (i in 1:length(listado1)) {
      r1 <- raster(listado1[i])
      v1 <- values(r1)

      for (j in 1:length(listado2)) {
        r2 <- raster(listado2[j])
        v2 <- values(r2)

        for (k in 1:length(listado3)) {
          r3 <- raster(listado3[k])
          v3 <- values(r3)

          if ((i==j) & (j==k)){

            df2 <- data.frame(NULL)
            df2 <- data.frame(v1, v2, v3)
            burn <- subset(df2, df2$v1 >= 0.3 & df2$v1 <= 1.0 & df2$v2 >= 0.2 & df2$v2 <= 1.3 & df2$v3 > 0.1 & df2$v3 <= 1.3)
            burned_area <- nrow(burn)*(xres(r1)*yres(r1))*10^(-4) # Hectares

            name <- paste(substr(listado1[i], 8, 15), sep="")
            df <- rbind(df, data.frame(name,burned_area))
            print(paste("iteracion:",i,j,k," ok",sep = " "))

          }
          else {
            print(paste("iteracion:",i,j,k," passed",sep = " "))
            invisible()}

        }
      }
    }

    write.csv(df,file = "burned_area.csv")

[可能观察到,我有三种类型的以*.tifcrNDVIcrNBR开头的预处理栅格(dNBR)文件,所有这些文件均列在每个“listado”变量。想法是遍历每种类型的文件并每天获取每个栅格文件的值。该代码执行了应有的工作(我得到了带有烧伤区域(满足条件的像素)的.csv文件,但是,由于每个栅格文件都对应于特定的日期,因此需要花费大量的时间进行计算,因此结果将显示为burned_area是每天的值,因此,发生这种情况的唯一可能性是当i=j=k时发生,但是应用后一种代码,迭代会覆盖for循环中的每种可能性。代码从i = 1开始运行,然后j = 1,然后k = 1,2,3 ...直到listado3[k]的最后一个文件,并且当listado3[k]的长度结束时,它传递到以下j+1索引并再次在k中循环每个(不必要的)迭代。

有人可以帮助我以更有效的方式做同样的事情吗?是否有可能对整个嵌套i=j=k循环强制使用“仅for”?我非常感谢您的任何建议。预先感谢,豪尔赫。

注意:所有光栅文件具有相同的范围nrowncolncell

我一直在尝试计算三个满足R条件(在Windows 10和R版本3.6.3中)的光栅文件的像素数。这个想法是使用这三个图像(它们是pre -...

r gis raster rgdal r-modis
2个回答
0
投票

嵌套循环有什么需要?如果您使用一个循环,则出现,则i = j = k将始终为真。


0
投票

请始终提供一个最小的独立示例。像这样

© www.soinside.com 2019 - 2024. All rights reserved.