在 R 中离散化堆栈中的所有栅格
Discretize all rasters in stack in R
我正在尝试同时将 R 中的 5 个堆叠栅格离散化为四分位数值。为此,我编写了以下循环,但它似乎无法正常工作。在代码中,"stack.disc" 是堆栈,"quartiles" 是一个 5 列数据框,其中 5 个栅格作为列,它们的四分位数值列在行中。
for(i in 1:ncol(quartiles)) {
for(j in 1:length(stack.disc@layers[[i]])) {
if(isTRUE(stack.disc@layers[[i]]@data@values[j] >= quartiles[1,i] &
stack.disc@layers[[i]]@data@values[j] < quartiles[2,i])) {
stack.disc@layers[[i]]@data@values[j] = 1
}
if(isTRUE(stack.disc@layers[[i]]@data@values[j] >= quartiles[2,i] &
stack.disc@layers[[i]]@data@values[j] < quartiles[3,i])) {
stack.disc@layers[[i]]@data@values[j] = 2
}
if(isTRUE(stack.disc@layers[[i]]@data@values[j] >= quartiles[3,i] &
stack.disc@layers[[i]]@data@values[j] < quartiles[4,i])) {
stack.disc@layers[[i]]@data@values[j] = 3
}
if(isTRUE(stack.disc@layers[[i]]@data@values[j] >= quartiles[4,i] &
stack.disc@layers[[i]]@data@values[j] <= quartiles[5,i])) {
stack.disc@layers[[i]]@data@values[j] = 4
}
}
}
代码仅在堆栈中的前 3 个栅格上运行。任何想法为什么它不适用于最后 2 个?
谢谢!
您可以使用 cut
对栅格进行重新分类(它有栅格*方法)。
s2 = stack(lapply(names(stack.disc), function(n)
cut(stack.disc[[n]], breaks=quartiles[,n])))
或者,使用 stackApply
的略短版本
stackApply(stack.disc, 1:5, function(r, na.rm) cut(r, breaks=quartiles[,names(r)]))
一些可重现的数据来证明:
stack.disc = stack(lapply(1:5, function(i) raster(matrix(rnorm(25, i),5,5))))
quartiles = t(quantile(stack.disc))
# layer.1 layer.2 layer.3 layer.4 layer.5
# 0% -1.0937068 0.498138 1.142862 2.229032 3.078026
# 25% 0.5171343 1.799564 2.496730 3.108751 4.484395
# 50% 1.1293477 2.099162 2.896269 3.818627 4.939167
# 75% 1.6348539 2.481976 3.615938 4.693733 5.314098
# 100% 2.4405652 3.511051 4.886970 5.456095 6.929452
我正在尝试同时将 R 中的 5 个堆叠栅格离散化为四分位数值。为此,我编写了以下循环,但它似乎无法正常工作。在代码中,"stack.disc" 是堆栈,"quartiles" 是一个 5 列数据框,其中 5 个栅格作为列,它们的四分位数值列在行中。
for(i in 1:ncol(quartiles)) {
for(j in 1:length(stack.disc@layers[[i]])) {
if(isTRUE(stack.disc@layers[[i]]@data@values[j] >= quartiles[1,i] &
stack.disc@layers[[i]]@data@values[j] < quartiles[2,i])) {
stack.disc@layers[[i]]@data@values[j] = 1
}
if(isTRUE(stack.disc@layers[[i]]@data@values[j] >= quartiles[2,i] &
stack.disc@layers[[i]]@data@values[j] < quartiles[3,i])) {
stack.disc@layers[[i]]@data@values[j] = 2
}
if(isTRUE(stack.disc@layers[[i]]@data@values[j] >= quartiles[3,i] &
stack.disc@layers[[i]]@data@values[j] < quartiles[4,i])) {
stack.disc@layers[[i]]@data@values[j] = 3
}
if(isTRUE(stack.disc@layers[[i]]@data@values[j] >= quartiles[4,i] &
stack.disc@layers[[i]]@data@values[j] <= quartiles[5,i])) {
stack.disc@layers[[i]]@data@values[j] = 4
}
}
}
代码仅在堆栈中的前 3 个栅格上运行。任何想法为什么它不适用于最后 2 个?
谢谢!
您可以使用 cut
对栅格进行重新分类(它有栅格*方法)。
s2 = stack(lapply(names(stack.disc), function(n)
cut(stack.disc[[n]], breaks=quartiles[,n])))
或者,使用 stackApply
stackApply(stack.disc, 1:5, function(r, na.rm) cut(r, breaks=quartiles[,names(r)]))
一些可重现的数据来证明:
stack.disc = stack(lapply(1:5, function(i) raster(matrix(rnorm(25, i),5,5))))
quartiles = t(quantile(stack.disc))
# layer.1 layer.2 layer.3 layer.4 layer.5
# 0% -1.0937068 0.498138 1.142862 2.229032 3.078026
# 25% 0.5171343 1.799564 2.496730 3.108751 4.484395
# 50% 1.1293477 2.099162 2.896269 3.818627 4.939167
# 75% 1.6348539 2.481976 3.615938 4.693733 5.314098
# 100% 2.4405652 3.511051 4.886970 5.456095 6.929452