微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

R循环在多个光栅上执行相同的任务?

如何解决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 举报,一经查实,本站将立刻删除。