我在由简单的i,j,k位置标识的3D网格中有一些数据(没有真实的空间信息)。这些数据现在都在RasterStack中。
b <- stack(system.file("external/rlogo.grd", package="raster"))
# add more layers
b <- stack(b,b)
# dimensions
dim(b)
[1] 77 101 6
产生77行,101列, 6层。
# upscale by 2
up <- aggregate(b,fact=2)
dim(up)
[1] 39 51 6
产生39行,51列, 6层。
Hoped-for行为:3层。
除了目前的行为之外,我还在寻找一种聚合各层的方法,这种方法是在每一层内进行聚合。我对其他数据结构开放,但更喜欢现有的升级/重采样/聚合算法,而不是我自己编写的算法。
潜在相关的是http://quantitative-advice.gg.mq.edu.au/t/fast-way-to-grid-and-sum-coordinates/110/5或spacetime包,它假定图层是时间而非空间,增加了更多的复杂性。
答案 0 :(得分:0)
我没有正确阅读文档。致aggregate across layers:
例如,
fact=2
将生成一个新的Raster *对象,其中2 * 2 = 4个单元格。如果提供两个数字,例如fact=c(2,3)
,则第一个将用于在水平方向聚合,第二个用于在垂直方向聚合,并且返回的对象将具有2 * 3 = 6个更少的单元格。同样,fact=c(2,3,4)
聚合2个(行),3个(列)和4个(层)组的单元格。
可能需要使用expand=TRUE
vs expand=FALSE
来使其发挥作用,但这似乎不一致(我有reported it作为错误)。
答案 1 :(得分:0)
您可以定义agg.fact
变量来表示值2:
agg.fact <- 2
up <- aggregate(b, fact = agg.fact)
dim(up)
[1] 39 51 6
现在我们生成一个表格,指出哪些图层将使用agg.fact
与其他人聚合:
positions <- matrix(1:nlayers(b), nrow = nlayers(b)/agg.fact, byrow = TRUE)
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6
并为每对图层应用一个函数(在这种情况下为mean
,但可能是max``,
sum`或另一个...)
up2 <- stack(apply(positions, 1, function(x){
mean(b[[x[1]]], b[[x[2]]])
}))
dim(up2)
[1] 77 101 3
或者如果想要在3个维度聚合(选择是否需要聚合1-2d,然后是3d或者副词):
up3 <- stack(apply(positions, 1, function(x){
aggregate(mean(b[[x[1]]], b[[x[2]]]), fact = agg.fact) #first 3d
#mean(aggregate(b[[x[1]]], fact = agg.fact), aggregate(b[[x[2]]]), fact = agg.fact) ##first 1d-2d
}))
dim(up3)
[1] 39 51 3