如何从r中的rasterstack中自动删除空栅格?

时间:2014-04-09 09:26:59

标签: r raster na

对于我的研究,我创建了一个有很多冰的区域的卫星数据的rasterstack,因此,很多图像完全被NA填充。这些我想自动从堆栈中删除。

假设我有一个rasterstack,

r <- raster(nrow=10, ncol=10)
s1 <- s2<- list()
for (i in 1:12) {
  s1[i] <- setValues(r, rnorm(ncell(r), i, 3) )
  s2[i] <- setValues(r, rnorm(ncell(r), i, 3) )
}
s1 <- stack(s1)
s3 <- subset(s1,1) 
s3[] <- NA
s2 <- stack(s2)

# regression of values in one brick (or stack) with another
s <- stack(s1,s3, s2)

中间图像,图像13,完全是NA,现在我可以使用子集函数删除它,但是我怎么能得到r自动删除这个图层,所以我得到的相同;

s_no_na <- stack(s1,s2)

3 个答案:

答案 0 :(得分:2)

这是另一种方法。如果所有值均为NA,则最小值也为NA。所以你可以这样做:

 i <- !is.na(minValue(s))
 s_no_na <- s[[i]]

如果已知minValue,则速度可能非常快(否则需要计算)。

答案 1 :(得分:0)

“自动”是什么意思?你必须测试它。

尝试使用!any(is.na(values(s)))all(is.na(values(s)))来测试每个栅格,其中s是栅格。将它放在一个构建最终堆栈的函数的循环中。

如果您需要单行,则使用Filter从列表中进行选择,然后使用do.callstack应用于已过滤的列表:

sf = do.call(stack, Filter(function(e){!all(is.na(values(e)))},list(s1,s3,s2)))

答案 2 :(得分:-1)

我更喜欢这种方法,它有点短而且甜美:

result <- rasters[!sapply(rasters, is.null)]