如何连续2年使用terra::tapp

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

我有一组光栅。我想应用从 2001-01-01 到 2002-12-31 然后从 2002-01-01 到 2003-12-31 的函数。 (每次两年)。是否可以使用 tapply 函数(我有一个带有循环的东西,但它很慢)。

  rast_stack <- sapply(1:1826, function(i) rast(nrows=10, ncols=10, xmin=0, xmax=10, ymin=0, ymax=10))
    rast_stack<-rast(rast_stack)
    rast_stack[]<-rnorm(n=ncell(rast_stack))
    terra::time(rast_stack)<-seq(as.Date("2001-01-01"),as.Date("2005-12-31"),by="day")
 Myfunction <- function(TempRast,TDMIN,TDMAX,TCXSTOP){
  X<-TempRast
  X[is.na(TempRast)|is.nan(TempRast)]<-0
  udevc<-TempRast
  udevc[]<-NA
  udevc[X<= TDMIN]<-0
  udevc[TDMIN< X & X< TDMAX]<-X[TDMIN< X & X< TDMAX]- TDMIN
  udevc[TDMAX <= X & X < TCXSTOP]<-(TDMAX - TDMIN) / (TDMAX - TCXSTOP)   (X[TDMAX <= X & X < TCXSTOP] - TCXSTOP)
  udevc[X>= TCXSTOP]<-0
  udevc[is.na(TempRast)|is.nan(TempRast)]<-NA
  return(udevc)
}

我想要类似的东西:

res<-tapp(rast_stack,2yearsIndex,myfunction)
r terra
1个回答
0
投票

您的示例数据

library(terra)
r <- rast(nl=1826, nrows=10, ncols=10, xmin=0, xmax=10, ymin=0, ymax=10)
set.seed(1)
values(r) <- rnorm(size(r))
time(r) <- seq(as.Date("2001-01-01"), as.Date("2005-12-31"), by="day")

根据年份创建索引。每个偶数年都会重命名为前一年(奇数)。

yrs <- as.integer(format(time(r), "%Y"))
i <- ((yrs %% 2) == 0)
yrs[i] <- yrs[i] - 1
yrs <- paste0(yrs, "-", yrs+1)

使用

terra::tapp

x <- tapp(r, yrs, mean)

x
#class       : SpatRaster 
#dimensions  : 10, 10, 3  (nrow, ncol, nlyr)
#resolution  : 1, 1  (x, y)
#extent      : 0, 10, 0, 10  (xmin, xmax, ymin, ymax)
#coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) 
#source(s)   : memory
#names       :  X2001.2002, X2003.2004, X2005.2006 
#min values  : -0.08979350, -0.1034173, -0.1411041 
#max values  :  0.08894972,  0.1243632,  0.1389769 
© www.soinside.com 2019 - 2024. All rights reserved.