Несколько вложенных циклов для итерации только при индексах i = j = k в R - PullRequest
1 голос
/ 31 марта 2020

Я пытался вычислить количество пикселей трех растровых файлов, которые удовлетворяют определенному условию с 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")

Как можно обратите внимание, у меня есть три типа предварительно обработанных растровых (*.tif) файлов, которые начинаются с crNDVI, crNBR и dNBR, все эти файлы перечислены в каждой переменной "listado". Идея состоит в том, чтобы перебирать файлы каждого типа и получать значения каждого растрового файла в день. Код делает то, что должен (я получаю файл .csv со сгоревшей областью (пиксели, которые удовлетворяют условию), однако вычисление занимает вечность, потому что каждый растровый файл соответствует определенному c дню и, следовательно, результат в burned_area - это значение в день, поэтому единственная возможность для этого - когда i=j=k, но, применяя последний код, итерация выполняется над каждой возможностью в for l oop. Код запускается из i = 1, затем j = 1, а затем k = 1,2,3 ... до последнего файла listado3[k], а когда длина listado3[k] заканчивается, он переходит к следующему индексу j+1 и зацикливает все снова и снова в k для каждой (ненужной) итерации.

Может ли кто-нибудь помочь мне сделать то же самое более эффективным способом? Есть ли возможность навязать "только i=j=k" для Целые вложенные циклы for Буду очень признателен за любые советы. Заранее спасибо, Хорхе.

Примечание: все растровые файлы имеют одинаковый экстент, nrow, ncol и ncell.

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Зачем нужны вложенные циклы? Появляется, если вы используете один l oop, тогда i = j = k всегда будет истинным.

0 голосов
/ 01 апреля 2020

Пожалуйста, всегда включайте минимальный самостоятельный пример. Вот так

library(raster)
set.seed(0)
r1 <- raster(nrow=10, ncol=10, vals=1:100) / 100
r2 <- raster(nrow=10, ncol=10, vals=c(1:50, 50:1)) / 100
r3 <- raster(nrow=10, ncol=10, vals=c(rep(1, 10), 11:100)) / 100

x <- ((r1==r2) & (r2==r3))
s <- stack(r1, r2, r3)
s <- mask(s, x, maskvalue=1)

Я остановился здесь, но я уверен, что есть простой способ продолжить. Но не ясно, что вы хотите делать дальше. Я предлагаю вам использовать вышеизложенное, чтобы перефразировать ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...