Вложенный в цикл для извлечения данных - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть список с именемord_pts с 4 файлами SpatialPointsDataFrame и список из 14 растров.Я хочу извлечь данные из 14 растра для координат каждого из файлов SpatialpointsDataFrame.Я пытался создать вложенный цикл for, но я получаю вывод только для первого объектаordin_pts.

crops<-list()
extract<-list() 
 for(j in 1:length(coord_pts)){
  for(i in 1:length(Temp_raster)){
   extract[[j*i]]<-extract(Temp_raster[[i]],coord_pts[[j]], method='simple')
   crops[[j]]<-data.frame(c(extract))
  }  
   colnames(crops)<-c('MeanTemp', 'Prec', 'Temp1', 'Temp10', 'Temp11', 'Temp12', 'Temp2', 'Temp3', 'Temp4', 'Temp5', 'Temp6', 'Temp7', 'Temp8', 'Temp9')      
   }

Ответы [ 3 ]

0 голосов
/ 26 сентября 2019

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

В простейшем случае вы делаете RasterStack из ваших файлов

library(raster)
s <- stack(system.file("external/rlogo.grd", package="raster"))
coord_pts <- cbind(1:4, 1:4) * 10
extract(s, coord_pts)

#     red green blue
#[1,] 255   255  255
#[2,]  55    55   53
#[3,] 255   255  253
#[4,] 149   159  186

Если вы не можете сделатьRasterStack, поскольку растры не выровнены, вы можете использовать список, как в вашем вопросе;и петля.

Temp_raster <- as.list(s)

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

m <- matrix(nrow=nrow(coord_pts), ncol=length(Temp_raster))
colnames(m) <- sapply(Temp_raster, names)
for (i in 1:length(Temp_raster)) {
   m[, i] <- extract(Temp_raster[[i]], coord_pts)
}

m
#     red green blue
#[1,]  255  255  255
#[2,]   55   55   53
#[3,]  255  255  253
#[4,]  149  159  186

Или для более сложных случаев

x <- list()
for (i in 1:length(Temp_raster)) {
   x[[i]] <- extract(Temp_raster[[i]], coord_pts)
}

И взять его оттуда.

0 голосов
/ 26 сентября 2019

Извините, я не объяснил это хорошо, SpatialPointsDataFrame в зависимости от набора координат находятся между 40 и 100 точками данных по всему миру и переменными (HI).Например:

Lat  Long          HI 
 -39.85000  -72.50000  0.4240000     
 -36.75000  142.10000  0.3620000    

...

14 растров - это глобальные данные (рез. 0,5 градуса) для годовой температуры, осадков и месячной температуры.Я хочу получить фрейм данных для каждого набора координат с индексом и 14 переменными из растра.

 Lat    Long    HI      temp        prec    temp1        temp2      temp3   ......
-39.85  -72.5   0.424   10.65100003 2305    15.77600002 15.2840004  13.36400032 
-36.75  142.1   0.362   14.54166676 466     20.79999924 21.1000004  18.59200096 
0 голосов
/ 25 сентября 2019

Основы рекурсии, не зная вашего набора данных ..

is.deep <- function(x){
  is.list(x) | is.data.frame(x)
}
list.dive <- function(L, func = NULL, ...){
      L <- func(L, ...)
      if(!is.deep(L)){
        L
      }else{
        lapply(L,function(x){
          list.dive(x, func, ...)
        })
      }
    }

Идея состоит в том, что вы пишете функцию, которая делает то, что вам нужно, а затем передаете список в L, и эта функция вfunc.Функция выполнится, проверит, является ли результат списком или объектом другого типа, который вы можете перебрать, она выполнит функцию снова, пока условие не будет выполнено.

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