【发布时间】:2017-12-14 07:29:39
【问题描述】:
我有一个包含 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、周期和月份。
这是我现在的代码:
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)
}
【问题讨论】:
-
总的来说,你应该使用
length而不是sum!