光栅砖中选定层的子分配
subassignment of selected layers in raster brick
我想通过将这些图层乘以另一个栅格来修改栅格块中的图层子集。
例如,如果我们有一个名为 'r.brick' 的栅格砖块,我们尝试将其图层 2:4 乘以栅格 'r.mult',具有相同的行和列维度:
r.brick[[2:4]]
returns 层 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)))
以下代码具有 r.brick 个具有 r.mult 值的多个第 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)
那么我只为你找到了一个解决方法(使用循环):
layers <- 2:4
for(i in layers) {
r.brick[[i]] <- r.brick[[i]] * r.mult
}
注意: 显然 []
子集的赋值仅适用于单层。
我认为这是一个缺失的功能。感谢您指出了这一点。我会在 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)
我想通过将这些图层乘以另一个栅格来修改栅格块中的图层子集。
例如,如果我们有一个名为 'r.brick' 的栅格砖块,我们尝试将其图层 2:4 乘以栅格 'r.mult',具有相同的行和列维度:
r.brick[[2:4]]
returns 层 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)))
以下代码具有 r.brick 个具有 r.mult 值的多个第 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)
那么我只为你找到了一个解决方法(使用循环):
layers <- 2:4
for(i in layers) {
r.brick[[i]] <- r.brick[[i]] * r.mult
}
注意: 显然 []
子集的赋值仅适用于单层。
我认为这是一个缺失的功能。感谢您指出了这一点。我会在 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)