цикл, чтобы сложить растры, хранящиеся в разных списках в R - PullRequest
0 голосов
/ 25 октября 2019

У меня есть вложенный список с большим количеством элементов и количеством растров в каждом элементе. Упрощенная структура списка выглядит следующим образом:

## create main List
r <- raster(ncol=3, nrow=3)
values(r) <- 1:ncell(r)
s <- stack(r,r*2,r*3)

List <- split(as.list(s), 1)  # here List has a single element but in the real example has >10

Мне нужно сложить растры, хранящиеся в другом списке (с именем Ref_List), в растры, хранящиеся в основном списке, соответственно:

stack(List[[1]][[1]], Ref_list[[1]])
stack(List[[1]][[2]], Ref_list[[2]])
stack(List[[1]][[3]], Ref_list[[3]])

...

Количество растров, содержащихся в Ref_list[[i]], такое же, как и в List[[i]][[j]]. Я попытался следующий цикл для выполнения операции стека, но результат равен NULL.

Есть идеи о том, как решить эту проблему? Спасибо!

List_stack <- lapply(List,function(i){ # i specifies elements within the list

  lapply(i,function(j){  # j specifies the elements of each element, within the list

    st <- stack(j)

    ## create REF list
    z <- raster(ncol=3, nrow=3)
    values(z) <- 0.5:ncell(z)
    t <- stack(z,z*2,z*3)
    Ref_list <- as.list(t)

    ## STACK REF list with MainList
    for(i in 1:length(Ref_list)){
      final <- stack(Ref_list[[i]], st)
    }
   }) 
})

Ответы [ 2 ]

0 голосов
/ 25 октября 2019

Как насчет этого? По сути, я установил j на 1 и i на длину List[[1]].

list_stack <- list() # There is a better way to initialize a list
for(i in 1:length(List[[1]])){
    for(j in seq_along(List)){
      list_stack[[i]] <- stack(List[[j]][[i]], Ref_list[[i]])
    }
}
0 голосов
/ 25 октября 2019

Полагаю, вам нужно что-то вернуть? И я думаю, что часть со стеком неправильна .. вы заменяете final с каждой итерацией

List_stack <- lapply(List,function(i){ # i specifies elements within the list

  lapply(i,function(j){  
# j specifies the 
#elements of each element, within the list

    st <- stack(j)

    ## create REF list
    z <- raster(ncol=3, nrow=3)
    values(z) <- 0.5:ncell(z)
    t <- stack(z,z*2,z*3)
    Ref_list <- as.list(t)
# i think you need to do this
    final = do.call(stack,list(Ref_list,st))

    return(final)

   }) 
})
...