对于我的研究,我创建了一个有很多冰的区域的卫星数据的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)
答案 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.call
将stack
应用于已过滤的列表:
sf = do.call(stack, Filter(function(e){!all(is.na(values(e)))},list(s1,s3,s2)))
答案 2 :(得分:-1)
我更喜欢这种方法,它有点短而且甜美:
result <- rasters[!sapply(rasters, is.null)]