从巨大的光栅文件中删除 NA 值
deleting NA values from huge rasterfile
我目前正在尝试从一个巨大的栅格文件(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 给出一条错误消息,指出它遇到了致命错误并终止。是否有更简单、更快速的解决方案来执行此操作?
每当我看到一个包含大部分缺失值的大型数组时,我认为 "sparse matrix" 是保存数据的有效方式。如果栅格中的非缺失数据均非零,则使用稀疏矩阵很简单。如果数据中有零,则需要一个额外的步骤(包括在下面)。
首先让我们创建一个主要包含 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)
您可以为此使用 rasterToPoints
函数。
library(raster)
r <- raster()
r[50:52] <- 1:3
xyv <- rasterToPoints(r)
write.csv(xyv, file ="raster.csv", row.names = FALSE)
我目前正在尝试从一个巨大的栅格文件(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 给出一条错误消息,指出它遇到了致命错误并终止。是否有更简单、更快速的解决方案来执行此操作?
每当我看到一个包含大部分缺失值的大型数组时,我认为 "sparse matrix" 是保存数据的有效方式。如果栅格中的非缺失数据均非零,则使用稀疏矩阵很简单。如果数据中有零,则需要一个额外的步骤(包括在下面)。
首先让我们创建一个主要包含 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)
您可以为此使用 rasterToPoints
函数。
library(raster)
r <- raster()
r[50:52] <- 1:3
xyv <- rasterToPoints(r)
write.csv(xyv, file ="raster.csv", row.names = FALSE)