【问题标题】:How to get the number of unique values for each layer in a Large raster stack in R?如何获取R中大型栅格堆栈中每一层的唯一值数量?
【发布时间】:2020-05-05 17:09:13
【问题描述】:

我有一大堆表示林地斑块(63 层)的栅格。我试图找到一种简洁的方法来获取每一层的唯一值的数量。

对于一个栅格,我已按如下方式完成此操作。

r1 <- raster(matrix(sample(1:100, 20), 10,10)) #create mock data
length(unique(r1)) #gives number of unique values 

但是,如果我有如下 3 个栅格的堆栈,是否有一种简洁的方法可以为每个图层获取此信息。

### mock data
r1 <- raster(matrix(sample(1:100, 20), 10,10))
r2 <- raster(matrix(sample(1:100, 50), 10,10))
r3 <- raster(matrix(sample(1:100, 10), 10,10))
### create raster stack
allrasters <- stack(r1, r2, 23)

【问题讨论】:

    标签: r stack gis raster


    【解决方案1】:

    您可以在raster 包中使用freq 来获取每个层的每个像素值的频率,然后使用nrow 计算不同值的数量。最后,您可以将数据从列表转换为 data.frame,以便在进一步计算时更轻松地调用它。

    library(raster)
    as.data.frame(lapply(freq(allrasters), function(x) nrow(x)))
    
    #    layer.1 layer.2 layer.3
    # 1       20      50      10
    

    【讨论】:

      【解决方案2】:

      示例数据

      library(raster)
      set.seed(1)
      r1 <- raster(matrix(sample(1:100, 20), 10,10))
      r2 <- raster(matrix(sample(1:100, 50), 10,10))
      r3 <- raster(matrix(sample(1:100, 10), 10,10))
      s <- stack(r1, r2, r3)
      

      解决方案 1:首先获取跨层值的唯一组合,然后逐层获取唯一值

      u <- unique(s) 
      x <- lapply(u, unique)
      sapply(x, length)
      

      解决方案 2:像这样遍历层

      y <- sapply(1:nlayers(s), function(i) unique(s[[i]]))
      sapply(y, length)
      

      解决方案 3:Jonathan V. Solórzano 的建议

      sapply(1:nlayers(s), function(i) NROW(freq(s[[i]])))
      #[1] 20 50 10
      

      【讨论】:

        【解决方案3】:

        一种方法可能是转换为 3D 数组并使用 apply

        library(raster)
        set.seed(1)
        r1 <- raster(matrix(sample(1:100, 20), 10,10))
        r2 <- raster(matrix(sample(1:100, 50), 10,10))
        r3 <- raster(matrix(sample(1:100, 10), 10,10))
        allrasters <- stack(r1, r2, r3)
        apply(as.array(allrasters),3,function(x)length(unique(as.vector(x))))
        [1] 20 50 10
        

        这不一定是您提出的问题,但如果您遇到此问题,您也可以使用 apply 申请到栅格堆栈。

        apply(as.array(allrasters),c(1,2),function(x)length(unique(x)))
              [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
         [1,]    3    3    3    3    3    3    3    3    3     3
         [2,]    3    3    3    3    3    3    3    3    3     3
         [3,]    3    2    3    3    3    3    2    3    3     3
         [4,]    3    3    3    2    3    3    3    3    2     3
         [5,]    3    3    3    3    3    3    3    3    3     3
         [6,]    3    3    3    3    3    3    3    3    3     3
         [7,]    3    3    3    3    3    3    3    3    3     3
         [8,]    3    3    3    3    3    3    3    3    3     3
         [9,]    3    3    3    3    3    3    3    3    3     3
        [10,]    3    3    3    3    3    3    3    3    3     3
        

        【讨论】:

        • 此解决方案适用于较小的数据集,但可能会导致无法加载到 RAM 的大型数据集出现问题
        猜你喜欢
        • 2014-11-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-13
        • 1970-01-01
        • 2018-01-24
        • 2021-01-15
        • 2018-07-08
        • 1970-01-01
        相关资源
        最近更新 更多