我列出了96个分类栅格(每个栅格都有一个关联的变量,即rcp,周期和月份),值为1-16,我想计算每个栅格中每个类别所覆盖的区域如果栅格中不存在该类别,则返回NA。
这是我现在创建的功能
a <- function(x){
rs <- x #categorical raster
b <- getValues(area(x, weights=FALSE))
b <- aggregate(b, by=list(getValues(x)), sum, na.rm=T)
b <- as.data.frame(b)
names(b) <- c("CLASS","AREA")
return(b)
}
这样做的问题是它只返回一个数据框,其中只包含现有的栅格值而没有丢失的值。见下文:
CLASS AREA
1 1 145084.052
2 5 39425.336
3 6 37912.591
4 10 10089.541
5 11 3150.571
6 15 1451.912
7 16 4289.296
如何返回包含所有类别(1-16)的数据框?并将所有输出合并为一个?列名应为rcp,period和month。
以下是我的代码:
mthLs <- c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")
rcpLs <- c("rcp26", "rcp45", "rcp60", "rcp85")
periodLs <- c("2020_2049", "2040_2069")
for(rcp in rcpLs){
rcpDir <- paste0(iDir, "/", rcp)
for(period in periodLs){
for (mth in 1:12) {
rs <- raster(paste0(iDir, "/", rcp, "/", period, "/cng_", mth, ".tif", sep=""))
b <- a(rs) #using function above
}
im <- cbind(RCP=rep(rcp,times=nrow(b)), PERIOD=rep(period,times=nrow(b)), MONTH=rep(mth,times=nrow(b)), b)
}
write.csv(im, paste(oDir, "/output.csv", sep=""), quote=T, row.names=F)
}
答案 0 :(得分:0)
这可能会有所帮助
txt <-
"CLASS,REA
1,145084.052
5,39425.336
6,37912.591
10,10089.541
11,3150.571
15,1451.912
16,4289.296"
b <- read.csv(textConnection(txt),sep = ",")
classes <- 1:16
merge(data.frame(CLASS = classes), b, by='CLASS', all.x=T)
结果:
CLASS REA
1 1 145084.052
2 2 NA
3 3 NA
4 4 NA
5 5 39425.336
6 6 37912.591
7 7 NA
8 8 NA
9 9 NA
10 10 10089.541
11 11 3150.571
12 12 NA
13 13 NA
14 14 NA
15 15 1451.912
16 16 4289.296
答案 1 :(得分:0)
当您提出R问题时,请提供一些示例数据。
library(raster)
r <- raster(nc=5, nr=5)
set.seed(20171214)
r1 <- setValues(r, sample(16, ncell(r), replace=TRUE))
r2 <- setValues(r, sample(16, ncell(r), replace=TRUE))
r3 <- setValues(r, sample(16, ncell(r), replace=TRUE))
如果您可以制作RasterStack(RasterLayers具有相同的范围和分辨率),您可以这样做:
s <- stack(r1,r2,r3)
x <- freq(s)
m <- data.frame(value=1:16)
for (i in 1:length(x)) {
y <- x[[i]]
colnames(y)[2] <- paste0("v", i)
m <- merge(m, y, all.x=TRUE)
}
m
# value v1 v2 v3
#1 1 3 2 1
#2 2 NA 3 NA
#3 3 2 2 1
#4 4 1 3 2
#5 5 1 NA 2
#6 6 1 3 3
#7 7 NA 3 4
# ...
或者,如果没有RasterStack,则创建一个RasterLayer对象列表,例如与
# z <- lapply(filenames, raster)
但是对于这个例子,我们可以手动完成:
z <- list(r1, r2, r3)
m <- data.frame(value=1:16)
for (i in 1:length(z)) {
y <- freq(z[[i]])
colnames(y)[2] <- paste0("v", i)
m <- merge(m, y, all.x=TRUE)
}
或者 - 也许最简单 - 带有文件名ff
m <- data.frame(value=1:16)
for (i in 1:length(ff)) {
y <- freq(raster(ff[i]))
colnames(y)[2] <- paste0("v", i)
m <- merge(m, y, all.x=TRUE)
}