从 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)
我不明白 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)