【问题标题】:deleting NA values from huge rasterfile从巨大的光栅文件中删除 NA 值
【发布时间】:2016-05-31 11:39:34
【问题描述】:

我目前正在尝试从一个巨大的光栅文件(1.9*10^7 观察值)中删除 NA 值。在这些栅格中,99.9% 是 NA 值。我的目标是删除 NA 并创建一个包含所有非 NA 值的 .csv 文件。 我的尝试如下:

# Load packages
packs = c('raster', 'rgdal')
sapply(packs, FUN = 'require', character.only = TRUE)
xy <- xyFromCell(raster, 1:ncell(raster))
v <- as.data.frame(raster)
xyv <- data.frame(xy, v)
rm(xy,v)
xyv <- na.omit(xyv)
write.csv(xyv, file ="raster.csv", row.names = F)

当我执行 na.omit() 时,R/Rstudio 会给出一条错误消息,指出它遇到了致命错误并终止。有没有更简单、更快的解决方案来执行此操作?

【问题讨论】:

    标签: r gis


    【解决方案1】:

    您可以为此使用rasterToPoints 函数。

    library(raster)
    r <- raster()
    r[50:52] <- 1:3
    xyv <- rasterToPoints(r)
    
    write.csv(xyv, file ="raster.csv", row.names = FALSE)
    

    【讨论】:

    • 即使对于我最大的光栅文件,它也能完美快速地运行!
    【解决方案2】:

    每当我看到一个包含大部分缺失值的大型数组时,我都会认为“稀疏矩阵”是一种保存数据的有效方式。如果栅格中的非缺失数据均非零,则使用稀疏矩阵很简单。如果数据中有零,则需要一个额外的步骤(包括在下面)。

    首先让我们创建一个主要包含 NA 的大型栅格。并从中创建一个矩阵。

    my.raster <- raster(nrows=1e3, ncols=1e4, xmn=0, xmx=10, vals=NA)
    my.raster[sample(1:(1e3*1e4), 100)] <- as.integer(runif(100,0,100))
    my.matrix <- as.matrix(my.raster)
    

    稀疏矩阵只存储非零元素,因此为了使这个稀疏矩阵,我们需要将 NA 更改为零。如果数据可能已经包含我们不想丢失的零点,我们会在使矩阵稀疏之前存储零点的位置。

    library(Matrix)
    zeros <- data.frame(xyFromCell(my.raster, which(my.matrix == 0)), val=0)
    my.matrix[is.na(my.matrix)] <- 0
    sp <- as(Matrix(my.matrix, sparse=T), "dgTMatrix") # use triplet form of sparse matrix
    

    现在值在sp@x 中,坐标存储在@i@j 中。所以,保存到 .csv

    my.df <- data.frame(x = xFromCol(my.raster, sp@j), y = yFromRow(my.raster, sp@i), val=sp@x)
    my.df <- rbind(zeros, my.df)
    write.csv(my.df, file ="raster.csv", row.names = F)
    

    【讨论】:

    • 谢谢!效果很好,稀疏矩阵真的是一个很好的功能!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多