我有一个4层的栅格堆栈。其中两层来自模型1,两层来自模型2。我需要计算每个模型的中值、第5百分位数和第95百分位数。有没有办法一步完成?即,不写出两个中间的栅格堆栈,然后再将它们连接在一起。我的尝试如下,但它没有按组执行函数。
library("terra")
# Create some toy data
a <- rast(ncol = 10, nrow = 10, vals=rep(5,100), names=1)
b <- rast(ncol = 10, nrow = 10, vals=rep(10,100), names=1)
c <- rast(ncol = 10, nrow = 10, vals=rep(5,100), names=2)
d <- rast(ncol = 10, nrow = 10, vals=rep(10,100), names=2)
z <- c(a, b, c, d)
# Try to write a function to do the work
app(z,
function(x) {
c(median(x), quantile(x, c(0.05, 0.95)))
},
filename = "grouped_stats.tif)
我想要的结果是一个6层的光栅堆栈。
class : SpatRaster
dimensions : 10, 10, 6 (nrow, ncol, nlyr)
resolution : 36, 18 (x, y)
extent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax)
coord. ref. : lon/lat WGS 84
sources : memory (3 layers)
memory (3 layers)
names : median_1, q5_1, q95_1, median_2, pc5_2, pc95_2
min values : 7.5, 5.0, 10.0, 7.5, 5.0, 10.0
max values : 7.5, 5.0, 10.0, 7.5, 5.0, 10.0
有什么主意吗?谢谢。
作用力1
受@spacedman的启发,我写了这个函数,但它并没有让我达到目的。把它放在这里是为了给其他人提供可能的灵感。
grouped_stats <- function(x) {
layers_names <- unique(names(x))
cell_output <- NA
for (each_layer in layers_names) {
cell_output <- rbind(cell_output,
c(median(x[[each_layer]], na.rm = TRUE),
quantile(x[[each_layer]], 0.05, 0.95)))
names(cell_output) <- glue("{each_layer}_{c('median','pc5','pc95')}")
}
cell_output
}
g <- app(z, fun = grouped_stats)
作用力2
我想越来越近了,但还没到。
my_stats_function <- function(x) {c(median(x), quantile(0.05, 0.95))}
app(z,
function(x){
unlist(tapply(x, layer_names, my_stats_function))
})
class : SpatRaster
dimensions : 10, 10, 4 (nrow, ncol, nlyr)
resolution : 36, 18 (x, y)
extent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax)
coord. ref. : lon/lat WGS 84
source : memory
names : 11, 1.95%, 21, 2.95%
min values : 7.50, 0.05, 7.50, 0.05
max values : 7.50, 0.05, 7.50, 0.05
努力3
我想我快到了。:-)
my_stats_function <- function(x) {c(median(x), quantile(x, c(0.05, 0.95)))}
app(z,
function(x){
unlist(tapply(x, layer_names, my_stats_function))
})
class : SpatRaster
dimensions : 10, 10, 6 (nrow, ncol, nlyr)
resolution : 36, 18 (x, y)
extent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax)
coord. ref. : lon/lat WGS 84
source : memory
names : 11, 1.5%, 1.95%, 21, 2.5%, 2.95%
min values : 5, 5, 5, 5, 5, 5
max values : 5, 5, 5, 5, 5, 5
2条答案
按热度按时间pgvzfuti1#
示例数据(为清楚起见,更改了图层名称)
您的“terra”版本不可能
tapp
,因为它不能处理返回多个数字的函数。我认为这是最干净的解决方案,但在本例中,因为有
quantile<SpatRaster>
方法,所以它 * 可能 * 执行起来更快但我只会在光栅非常大的情况下才看。
我认为在所有情况下,使用
代替
下面是使用循环和
app
的效率较低的解决方案uinbv5nw2#
如果使用函数中的零件,则可以执行以下操作:
首先定义哪些层属于哪个组:
然后将
x
设为子集并进行处理:我不知道你是怎么得到你的样本中值为7.5的,所以也许你用了
mean
,也许你的分组是不同的...