我使用 terra pacakge 已经有一段时间了,现在我想看看我是否可以在栅格中做一些我用来做的任务,在这些任务中我必须在制作函数之前将栅格转换为数据框,这是通常的我用来做的任务是空间栅格的最佳类,我用来做的是这样的:
首先我加载包并将堆栈转换为数据框
library(terra)
library(geodata)
library(vegan)
library(dplyr)
# download climatic variables from terra
Clim <- geodata::worldclim_country(country = "denmark", var = "bio", path = getwd())
# Transform to data frame, keeping the cells to translate back to raster
ClimDF <- terra::as.data.frame(Clim, cells = T)
然后我使用了 vegan 包中的 cascadeKM 函数,我声明我想测试 2 到 5 组的聚类。这将使这些聚类并计算一些索引,calinski 或简单结构索引,然后看看哪个是最佳聚类
## Use cascade km to find several kmeans plus index
Clust <- vegan::cascadeKM(data = ClimDF[,-1], inf.gr = 2, sup.gr = 5)
## Get the maximum Calinski to see what is the optimum clustering
OptimumClust <- Clust$results |>
t() |>
as.data.frame() |>
dplyr::filter(calinski == max(calinski)) |>
rownames()
然后我将值返回给模板
Template <- Clim[[1]]
values(Template) <- NA
Template[ClimDF$cell] <- Clust$partition[,OptimumClust]
plot(Template, colNA = "black")
现在我想绕过整个转换到 data.frame,所以我首先尝试只做 kmeans,然后看看我是否真的可以计算 calinski 或 SSI,但即使在那个时候我也卡住了,我是按照这个tutorial,但是这是行不通的
我试图复制上述教程:
set.seed(99)
# We want to create 10 clusters, allow 500 iterations, start with 5 random sets using "Lloyd" method
kmncluster <- kmeans(na.omit(Clim), centers = 5, iter.max = 500, nstart = 5)
但是,我得到这个错误
Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1)
我不确定为什么一开始会出现这个错误,na.omit 不会去掉 NA 值吗?我检查了没有 Inf 或 -Inf。我梦想的场景是用 spatVect 完成在 cascadeKM 中完成的所有工作,而不必去 data.frame 来回,但如果我真的可以做一个 kmeans 我什至无法开始
我假设教程中的示例失败,因为您的数据中有 NA。这是一个扩展版本(具有更简单的输入数据),它说明了 NA。 示例数据
library(terra)
s <- rast(system.file("ex/logo.tif", package="terra"))
s[1,] <- NA
k-均值
v <- na.omit(values(s))
set.seed(99)
kmn <- kmeans(v, centers=5, iter.max = 500, nstart = 5, algorithm="Lloyd")
kr <- rast(s, nlyr=1)
i <- attr(v, "na.action")
j <- (1:ncell(s))[-i]
kr[j] <- kmn$cluster
plot(kr)