栅格块中所选图层的子分配

时间:2017-01-13 17:13:41

标签: r r-raster

我希望通过将这些图层乘以另一个栅格来修改栅格块中的图层子集。

例如,如果我们有一个名为' r.brick'我们尝试将它的图层2:4乘以光栅,' r.mult',具有相同的行和列尺寸:

  • r.brick[[2:4]]按预期返回图层2:4

  • r.brick[[2:4]] * r.mult成功地将这些图层与预期相乘

但是,如果我尝试将结果分配回子集层,我会收到错误

r.brick[[2:4]] = r.brick[[2:4]] * r.mult
# Error in value[] <- val : 
#   incompatible types (from S4 to double) in subassignment type fix

错误消息表明分配正在尝试分配栅格而不是栅格本身。但是如果我尝试使用getValues进行分配,我会收到一个不同的错误:

r.brick[[2:4]] = getValues(r.brick[[2:4]] * r.mult)
# Error in .local(x, values, ...) : length(values) is not equal to ncell(x)

这样做的正确方法是什么?

一些可重现的数据:

library(raster)
r.list = vector("list", 20)
set.seed(123)
for (i in 1:20) {
  r.list[[i]] = raster(vals=runif(100), nrows=10, ncols=10, ext=extent(c(0,25,0,25)))
}
r.brick = brick(r.list)
r.mult = raster(vals=sample(2,100,T), nrows=10, ncols=10, ext=extent(c(0,25,0,25)))

3 个答案:

答案 0 :(得分:3)

然后我只为你找到一个解决方法(使用循环):

layers <- 2:4
for(i in layers) {
  r.brick[[i]]  <- r.brick[[i]] * r.mult
}

注意:显然,使用[]子集的作业仅适用于单个图层。

答案 1 :(得分:2)

我认为这是一个缺失的功能。感谢您指出了这一点。我会在maRtin之后使用循环(可能在创建RasterStack之后,可能更有效)。如果数据集不是太大,您可以执行

# example data
library(raster)
b <- brick(nrows=2, ncols=2, nl=6)
values(b) <- rep(1:4, 6) 
r.mult <- raster(vals=10, nrows=2, ncols=2)


values(b)[,3:4] <- values(b[[3:4]] * r.mult)
# values(b)

答案 2 :(得分:1)

以下代码包含带有r.mult值的r.brick栅格值的多个2-4层,并将结果分配给r.brick图层2-4。

attr(attr(r.brick, 'data'), 'values')[,2:4] = attr(attr(r.brick, 'data'), 'values')[,2:4] * attr(attr(r.mult, 'data'), 'values')

attr(attr(r.brick, 'data'), 'values')[,2:4] = getValues(r.brick[[2:4]] * r.mult)