分类的光栅图像在R中提取信息循环

时间:2018-05-24 21:37:08

标签: r loops for-loop classification r-raster

我有800个分类的光栅图像(7个类),一个图像的每个类需要以平方米计算。到目前为止,它适用于一个图像,但不适用于循环。我该怎么做才能解决它?

report_files<-list(list of 800 tif files)
    for( i in report_files){
  reportfiles_single<-raster(report_files[i])
  df<-as.data.frame(table(reportfiles_single))
  df2<-as.data.frame(df$Freq*(0.070218*0.070218))
  {report_mean<- df2}
}

此部分适用于一个 - 并且有一个示例文件:https://ufile.io/rb7tj

a<-raster("test060707.tif")
val<-values(a)
table_val<-data.frame(val)
df<-as.data.frame(table(table_val))
df2<-as.data.frame(df$Freq*(0.070218*0.070218))

1 个答案:

答案 0 :(得分:0)

你的循环不正确。您执行for( i in report_files){,但稍后使用i,就好像您有for( i in 1:length(report_files)){

一样

在循环内部执行table(reportfiles_single),而在您使用的工作代码示例中,等效值为table(values(reportfiles_single))

此外,您不会保留任何结果,因为您在每次迭代中覆盖report_mean

因此,您应该首先了解循环的工作原理,然后首先做一些简单的示例。

另外,您确定数据的空间分辨率大约是7 x 7厘米吗?这是可能的,但似乎不太可能。

以下是您可能会做的一个示例。我使用freq方法,因为它与内存安全无关,与table(values())

不同
library(raster)
f <- system.file("external/test.grd", package="raster")
report_files <- c(f, f, f)

res <- list()
for( i in 1:length(report_files)){
    r <- raster(report_files[i])
    # note the -2 for this example, you probably do not want that with your data
    f <- freq(r, digits= -2)
    cellsize <- prod(res(r))
    f[,2] <- f[,2] * cellsize
    res[[i]] <- f
}

您可以执行以下操作,而不是使用循环:

s <- stack(report_files)
x <- freq(s, digits=-2)

稍后再加上细胞大小。