我有一组光栅。我想应用从 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)
您的示例数据
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