代码之家  ›  专栏  ›  技术社区  ›  BetterCallMe

在创建SpatialPointDataFrame时忽略行,其中rasterstack的任何光栅层的单个像素值为NA

  •  0
  • BetterCallMe  · 技术社区  · 6 年前

    我有三个光栅,例如r1,r2,r3。我想使用rasterToPoints()从这些光栅创建空间点数据帧。但问题是,在执行rasterToPoints()期间,我想忽略任何至少包含一个NA的行。

    library(raster)
    r1 = raster(matrix(c(1,NA,2,3,4,5,NA,5,6), byrow = TRUE))
    r2 = raster(matrix(c(1,2,2,NA,4,5,NA,5,64), byrow = TRUE))
    r3 = raster(matrix(c(1,NA,2,3,56,5,54,5,6), byrow = TRUE))
    r = stack(r1,r2,r3)
    r_spdf = rasterToPoints(r, spatial = TRUE)
    r_spdf@data
        layer.1 layer.2 layer.3
    1       1       1       1
    2      NA       2      NA
    3       2       2       2
    4       3      NA       3
    5       4       4      56
    6       5       5       5
    7      NA      NA      54
    8       5       5       5
    9       6      64       6
    

    我想忽略这一行r\u spdf@数据如果有一个单元为NA,则输出如下:

        layer.1 layer.2 layer.3
    1       1       1       1
    2       2       2       2
    3       4       4      56
    4       5       5       5
    5       5       5       5
    6       6      64       6
    

    后来呢无线电频率以上行的坐标如下:

       > r_spdf@coords
             x          y
       [1,] 0.5 0.94444444
       [2,] 0.5 0.72222222
       [3,] 0.5 0.50000000
       [4,] 0.5 0.38888889
       [5,] 0.5 0.16666667
       [6,] 0.5 0.05555556
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Robert Hijmans    6 年前

    我们可以用 complete.cases 在中查找任何缺少的值 data 数据 coords

    inds <- complete.cases(r_spdf@data)
    #Or another way to calculate inds is using rowSums
    #inds <- !rowSums(is.na(r_spdf@data)) > 0
    
    #now subset the Spatial object
    r_spdf <- r_spdf[inds, ]
    
    r_spdf@data
    #  layer.1 layer.2 layer.3
    #1       1       1       1
    #3       2       2       2
    #5       4       4      56
    #6       5       5       5
    #8       5       5       5
    #9       6      64       6
    
    r_spdf@coords
    #       x          y
    #[1,] 0.5 0.94444444
    #[2,] 0.5 0.72222222
    #[3,] 0.5 0.50000000
    #[4,] 0.5 0.38888889
    #[5,] 0.5 0.16666667
    #[6,] 0.5 0.05555556
    
        2
  •  0
  •   Robert Hijmans    6 年前

    您可以将SpatialPointsDataFrame子集,或更改光栅,以便如果任何单元为NA,则该单元在所有层中都将变为NA。这样地

    m <- sum(is.na(r))
    s <- mask(r, m, maskvalue=0, inverse=TRUE)
    

    现在你得到你想要的了

    r_spdf <- rasterToPoints(s, spatial = TRUE)
    as.data.frame(r_spdf)
    #  layer.1 layer.2 layer.3   x          y
    #1       1       1       1 0.5 0.94444444
    #2       2       2       2 0.5 0.72222222
    #3       4       4      56 0.5 0.50000000
    #4       5       5       5 0.5 0.38888889
    #5       5       5       5 0.5 0.16666667
    #6       6      64       6 0.5 0.05555556
    
    coordinates(r_spdf)
    #       x          y
    #[1,] 0.5 0.94444444
    #[2,] 0.5 0.72222222
    #[3,] 0.5 0.50000000
    #[4,] 0.5 0.38888889
    #[5,] 0.5 0.16666667
    #[6,] 0.5 0.05555556
    
    推荐文章