在R中,我试图在每周时间间隔到每天时间间隔之间创建的堆栈之间进行插值。插值方法可以是最近邻或线性插值。
我已经看到可以使用na.approx或样条线对时间序列进行此操作。
此外,如果可能的话,我想将该对象保留为堆栈(无数据框)。
#Dummy example
#---#
library(raster)
# Create date sequence
idx <- seq(as.Date("2000/1/1"), as.Date("2000/12/31"), by = "week")
# Create raster stack and assign dates
r <- raster(ncol=20, nrow=20)
s <- stack(lapply(1:length(idx), function(x) setValues(r,
runif(ncell(r)))))
s <- setZ(s, idx)
# Do interpolation to daily resolution
# (Perhaps it should be done one by one, perhaps all at once...)
# ...
假设我的实际堆栈的尺寸为c(20,20,52),结果将为尺寸c(20,20,366)。
感谢您的帮助
答案 0 :(得分:2)
您需要编写一个函数f
,该函数用于向量(一个单元格),例如s[1]
。然后像calc
一样使用calc(s, f)
应用此功能
这是一个使用approx
的简单示例,可以用样条曲线或其他插值器代替
library(raster)
r <- raster(ncol=20, nrow=20)
s <- stack(lapply(1:length(idx), function(x) setValues(r, runif(ncell(r)))))
idx <- seq(as.Date("2000/1/1"), as.Date("2000/12/31"), by = "week")
dr <- seq(as.Date("2000/1/1"), as.Date("2000/12/31"), by = "day")
f <- function(x) approx(idx, x, dr, rule=2)$y
# test <- f(s[1])
x <- calc(s, f)
一个单元格的结果
plot(dr, as.vector(x[1]), pch="+")
points(idx, as.vector(s[1]), pch=20, col="red", cex=2)
lines(idx, as.vector(s[1]), col="blue")