我目前正在尝试从巨大的光栅文件中删除NA值(1.9 * 10 ^ 7观察值)。在这些栅格中,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会给出一条错误消息,告知它遇到致命错误并终止。是否有更简单,更快速的解决方案来执行此操作?
答案 0 :(得分:1)
每当我看到一个大多数缺少值的大数组时,我认为&#34;稀疏矩阵&#34;作为保存数据的有效方式。如果栅格中的非缺失数据都非零,则使用稀疏矩阵非常简单。如果数据中有零,则需要一个额外的步骤(包含在下面)。
首先让我们创建一个主要是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)
答案 1 :(得分:1)
您可以使用rasterToPoints
功能。
library(raster)
r <- raster()
r[50:52] <- 1:3
xyv <- rasterToPoints(r)
write.csv(xyv, file ="raster.csv", row.names = FALSE)