从 R 中的 {terra} 包了解聚合

Understanding aggregate from the {terra} package in R

我不明白 R {terra} 包在聚合栅格像元方面做了什么。这是一个没有绘制输出的示例。

library("terra")

x <- rast(nrow=5, ncol=4)

values(x) <- c(1,NA,NA,1,
               1,NA,NA,1,
               1,NA,NA,1,
               1,NA,NA,1,
               1,NA,NA,1)

y <- aggregate(x, fact = 2, fun = "length")

y_polys <- as.polygons(y, dissolve = FALSE) %>% 
            st_as_sf() %>%
            rename(values = lyr.1)

ggplot() + geom_sf(data = y_polys, aes(fill = as.character(values)))

为什么单元格的值都是4?两个单元格的值不应该是 2 而不是 4,因为只有 2 个栅格单元格进入 'length' 吗?我试着用下面的另一张图来说明这一点:



编辑 1:

这给了我想要的结果,但我有点困惑为什么(还有更好的方法吗?)。

library("terra")

x <- rast(nrow=5, ncol=4)

values(x) <- c(1,NA,NA,1,
               1,NA,NA,1,
               1,NA,NA,1,
               1,NA,NA,1,
               1,NA,NA,1)

y <- classify(x, cbind(NA, 0))

z <- aggregate(y, fact = 2, fun = sum, na.rm=T)

z_polys <- as.polygons(z, dissolve = FALSE) %>% 
            st_as_sf() %>%
            rename(values = lyr.1)

ggplot() + geom_sf(data = z_polys, aes(fill = as.character(values)))

跟进:

嗨,罗伯特,

感谢您的帮助。根据您的示例,我可以看到长度对 NA 进行计数。

length(c(NA, NA, 1, 1))
[1] 4

但为什么在下面的这个例子中,底部的两个单元格是“4”,而每个单元格只使用了 2 个栅格单元格?

library("terra")
x <- rast(nrow=5, ncol=4)
values(x) <- c(1,NA,NA,1, 1,NA,NA,1, 1,NA,NA,1, 1,NA,NA,1, 1,NA,NA,1)
y <- aggregate(x, fact = 2, fun = length)

plot(y, col=c("pink", "light blue"))
lines(rast(x), col="gray", lwd=3)
lines(y, col="blue", )
text(x)
text(y, cex=1.5, col="red")

我认为您误解了 length 如何对待 NA:

length(c(NA, NA, 1, 1))
[1] 4

您可以使用 sum

而不是 length
library("terra")
x <- rast(nrow=5, ncol=4)
values(x) <- c(1,NA,NA,1, 1,NA,NA,1, 1,NA,NA,1, 1,NA,NA,1, 1,NA,NA,1)
y <- aggregate(x, fact = 2, fun = sum, na.rm=TRUE)

plot(y, col=c("pink", "light blue"))
lines(rast(x), col="gray", lwd=3)
lines(y, col="blue", )
text(x)
text(y, cex=1.5, col="red")

更一般地说,如果你想计算不是 NA 的单元格的数量,你可以这样做

z <- !is.na(x)
y <- aggregate(z, fact = 2, fun = sum, na.rm=TRUE)