我有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))
答案 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)
稍后再加上细胞大小。