R terra: скользящая сумма по слоям

Имея большой стек растров временной серии, я хотел бы создать еще один растровый стек, который представляет 5-дневную скользящую сумму для каждого пикселя по слоям. Учитывая размер растрового стека, raster::calc работает бесконечно для этой задачи, и поэтому мне было интересно, можно ли реализовать эту операцию быстрее, используя terra::lapp. Однако:

library(terra)
stack_A<-rast(nlyrs=10)
rollsum<-function(x){data.table::frollsum(x,n=5)}

stack_B<-lapp(stack_A, fun=rollsum)

Возвращает ошибку:

"Error in (function (x)  : 
  unused arguments (c(0, 0,...

or: [lapp] I do not like 'fun' :("

Буду признателен, если кто-нибудь подскажет, где ошибка, или, может быть, предложит другую реализацию (stars::?)

Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения &quot;многие ко многим&quot; в Laravel с методами присоединения и отсоединения
Отношения &quot;многие ко многим&quot; в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
0
0
102
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать terra::app для этого; terra::app эквивалентно raster::calc. Вы пробовали terra::lapp, этот метод эквивалентен raster::overlay.

library(terra)
library(data.table)
f <- system.file("ex/logo.tif", package = "terra")
r <- rast(c(f,f,f,f))
rollsum <- function(x){data.table::frollsum(x,n=5)} 

x <- app(r, rollsum)

Я не уверен, что это будет намного быстрее, так как узким местом, вероятно, является функция rollsum.

В "терре" версии 1.6-47 есть функция roll, и я ожидаю, что она будет намного быстрее.

library(terra)
#terra 1.6.47
f <- system.file("ex/logo.tif", package = "terra")
r <- rast(c(f,f,f,f))
y <- roll(r, 5, "sum", type = "to")

Большое спасибо @RobertHijmans, функция terra::roll действительно сделала это намного быстрее.

tabumis 26.12.2022 23:25

Другие вопросы по теме