【问题标题】:Store raster names& means for a large n of rasters存储大量栅格的栅格名称和方法
【发布时间】:2019-02-23 02:05:43
【问题描述】:

对于大量栅格,我需要遍历栅格并获得栅格名称和栅格的平均像元值。

此代码工作正常,但仅存储循环中最后一个元素的结果,当然我需要为每个 i 存储它(=每个栅格)。

 for(i in ras){
      dfff$A <- cellStats(i,"mean")
      dfff$B <- i 
    }

我需要一个代码来存储每个栅格的结果,包括名称和平均值(因此可以很容易地看到哪个平均值对应于哪个栅格)。 这会导致致命错误。

   for(i in ras){
      dfff[i]$A <- cellStats(i,"mean")
      dfff[i]$B <- i 
    }

有人知道如何解决这个问题吗?

【问题讨论】:

    标签: loops for-loop raster


    【解决方案1】:

    如果栅格具有相同的起源和范围,您可以简单地做

    library(raster)
    s <- stack(ras)
    cellStats(s)
    

    否则,您可以循环执行 cellStats

    d <- rep(NA, length(ras))
    nms <- rep(NA, length(ras))
    for(i in 1:length(ras)){
         d[i] <- cellStats(ras[[i]], "mean")
         nms[i] <- names(ras[[i]])
    }
    

    我不确定您所说的栅格“名称”是什么意思。在您的代码中,您将整个对象分配给“B”。但无论哪种方式,您都不需要在循环中执行此操作,因为您已经有一个栅格列表(我认为这就是 ras 的内容。)所以您也可以这样做

    nms <- sapply(ras, names)
    

    或者你的意思是文件名?

    nms <- sapply(ras, filename)
    

    现在你可以做

    df <- data.frame(name=nms, mean=d)
    

    第二个循环的问题是i 不是数字索引,它是一个光栅对象。所以你不能这样做diff[i]

    【讨论】:

    • 当我有一个平均值列表时,我需要查看它们来自哪个栅格。例如:光栅“蓝色”的平均值为 3.39,光栅“红色”的平均值为 5.00,光栅“苹果”的平均值为 12.33,...;; Ras 确实是一个栅格列表
    • 这个解决方案的问题是它会生成错误“invalid subscript type S4” d[i]
    • 我认为错误是由于我已修复的拼写错误(d 而不是 ras)造成的。至于 blueapple:是的,这就是 `sapply(ras, names)` 会得到的。
    猜你喜欢
    • 1970-01-01
    • 2010-09-10
    • 2014-11-01
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    相关资源
    最近更新 更多