如何解决R循环在多个光栅上执行相同的任务?
我希望创建一个循环来对文件夹中的 12 个栅格执行相同的任务,我已经为 1 个栅格完成了上述任务。该任务涉及计算单元格(具有 1 2 3 或 4 类的类),然后计算每个类的面积。然后我需要将面积值保存在一个新的数据框中,以便进一步分析和可视化。
我需要将 1 个栅格保存为基线(这是我示例中的那个),其余标题 Sub_A、Sub_B 等等,直到 Sub_K。
library(sp)
library(raster)
library(rgdal)
library(leaflet)
wd<- ('E:/Subs')
setwd(wd)
zuk1<- raster("E:/Subs/ZUK1_MAX.tif")
zuk1
zuk1<- setMinMax(zuk1)
zuk1[zuk1 == 0]<- NA
plot(zuk1,main='Baseline Hazard')
#count for pixel per class
hazard_fr<- freq(zuk1,useNA="no")
hazard_fr
resclass<- res(zuk1)
area_km2<- hazard_fr[,"count"] * prod(resclass) * 1e-06
df_class_area<- data.frame(Hazard = (c("Low","Moderate","Significant","Extreme")))
df_class_area
解决方法
这是获得所需输出的另一种方法。这与杰里米的回答非常相似;但使用 lapply
。
# List files which names start with zuk and end with .tif
zuk_files <- list.files(pattern = glob2rx("zuk*.tif"))
# The loop
resuls <- lapply(zuk_files,function(x){
zuk1 <- raster(x)
zuk1 <- setMinMax(zuk1)
zuk1[zuk1 == 0] <- NA
hazard_fr <- freq(zuk1,useNA="no")
resclass <- res(zuk1)
hazard_fr[,"count"] * prod(resclass) * 1e-06
})
,
如果你提供一个小的示例数据,其他人会更容易帮助你。我知道对于这种情况,您可能无法提供它们,因为 tiff 文件通常很大。
无论如何,你可以试试这个:
# list all tiff files in your directory
zuk_files <- list.files(pattern = "*.tif")
# you can also try to be more specific like:
zuk_files <- list.files(pattern = "ZUK.*_MAX.tif")
# then apply the same operations for all of the target files
# first create a list for whatever you want to loop over
zuk <- list()
hazard_fr <- list()
resclass <- list()
area_km2 <- list()
df_class_area <- list()
# now do the same things for all items in the list
for (i in 1:length(zuk_files)){
zuk[[i]] <- raster(zuk_files[[i]])
zuk[[i]] <- setMinMax(zuk[[i]])
zuk[[i]][zuk[[i]] == 0] <- NA
hazard_fr[[i]] <- freq(zuk[[i]],useNA="no")
resclass[[i]] <- res(zuk[[i]])
area_km2[[i]] <- hazard_fr[[i]][,"count"] * prod(resclass[[i]]) * 1e-06
df_class_area[[i]] <- data.frame(Hazard = (c("Low","Moderate","Significant","Extreme")))
}
# then all the data are stored in the list,you can acess them using the index like:
zuk[[1]]
# or save out your target results like:
zuk_1 <- zuk[[1]]
但我不确定你是否在
中犯了错误df_class_area <- data.frame(Hazard = (c("Low","Extreme")))
我不确定这一行是否符合您的预期,无论如何,您可以从上面的示例中学习为该 df_class_area 编写循环,我相信。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。