从巨大的栅格文件中删除NA值

3

我目前正试图从一个巨大的栅格文件(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会给出一个错误消息,表示它遇到了致命错误并终止。是否有更简单和更快的解决方案来执行此操作?
2个回答

2
您可以使用rasterToPoints函数来完成此操作。
library(raster)
r <- raster()
r[50:52] <- 1:3
xyv <- rasterToPoints(r)

write.csv(xyv, file ="raster.csv", row.names = FALSE)

这个工具即使是对于我最大的栅格文件,也能完美快速地运行! - Thoegernh

1
每当我看到一个大的数组,其中大部分数值缺失时,我会想到“稀疏矩阵”作为一种有效的数据存储方式。如果您栅格中的非缺失数据全部为非零,则使用稀疏矩阵非常简单。如果数据中存在零,则需要进行一步额外操作(如下所示)。
首先让我们创建一个大的栅格图,其中大部分为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)

谢谢!这很有效,而且稀疏矩阵确实是一个很棒的功能! - Thoegernh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接