R:使用第二个栅格堆栈中的图层替换栅格堆栈中的多个图层

时间:2017-04-27 11:03:14

标签: r r-raster

我有一个光栅堆栈,需要用另一个堆栈中的图层替换它包含的一些图层。

我想解决方案非常简单明了,但到目前为止我无法找到它。

为了给你一个可重复的例子,这是我试图做的:

library(raster)

# create some raster
r1 <- raster(nrows=10, ncols=10, xmn=0, xmx=10, ymn = 0, ymx = 10)
r1[] <- sample(1:100, 100, replace = TRUE)

r2 <- raster(nrows=10, ncols=10, xmn=0, xmx=10, ymn = 0, ymx = 10)
r2[] <- sample(1:100, 100, replace = TRUE)

r3 <- raster(nrows=10, ncols=10, xmn=0, xmx=10, ymn = 0, ymx = 10)
r3[] <- sample(1:100, 100, replace = TRUE)

r4<- raster(nrows=10, ncols=10, xmn=0, xmx=10, ymn = 0, ymx = 10)
r4[] <- sample(1:100, 100, replace = TRUE)

# put the raster into a stack
r_stack <- stack(r1, r2, r3, r4)

#calculate the mean of the raster
r_mean <- mean(r_stack)

# What I would like to do is to subtract the mean from some of the
# raster in the stack (layers_to_replace), but not from all, and to             
# replace the raster in the stack with the new difference.
# For example I would like to replace the second and fourth layer with     
# the difference.
l_replace <- c(2, 4)

# Note: I place the difference into a second stack for the sake
# of the example as my original data comes in a second stack
rep_stack <- r_stack[[l_replace]] - r_mean

r_stack[[l_replace]] <- rep_stack

不幸的是,这种方法不起作用并引发以下错误:

Error in v[] <- value : incompatible types (from S4 to logical) in subassignment type fix
In addition: Warning messages:
1: In if (i < 1) { : the condition has length > 1 and only the first element will be used
2: In if (i > nl + 1) { : the condition has length > 1 and only the first element will be used
3: In if (i > nl) { : the condition has length > 1 and only the first element will be used

关于如何解决这个问题的任何想法都将受到欢迎。

1 个答案:

答案 0 :(得分:0)

这应该有效:

for(ind in seq(along = l_replace)) r_stack[[l_replace[ind]]][] <- rep_stack[[ind]][]

r_stack
class       : RasterStack 
dimensions  : 10, 10, 100, 4  (nrow, ncol, ncell, nlayers)
resolution  : 1, 1  (x, y)
extent      : 0, 10, 0, 10  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
names       : layer.1, layer.2, layer.3, layer.4 
min values  :    1.00,  -54.25,    2.00,  -54.25 
max values  :   100.0,    51.5,   100.0,    51.5

或者,在某种程度上更容易阅读:

for(ind in seq(along = l_replace)){
  setValues(r_stack, getValues(rep_stack[[ind]]), layer = l_replace[ind])
}