Удаление значений NA из огромного растрового файла
В настоящее время я пытаюсь удалить значения NA из огромного растрового файла (1.9*10^7 наблюдений). В этих растрах 99,9% являются значениями NA. Моя цель - удалить NA и создать файл.csv, содержащий все значения, отличные от NA. моя попытка заключается в следующем:
# 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 ответа
Вы можете использовать rasterToPoints
функция для этого.
library(raster)
r <- raster()
r[50:52] <- 1:3
xyv <- rasterToPoints(r)
write.csv(xyv, file ="raster.csv", row.names = FALSE)
Всякий раз, когда я вижу большой массив с в основном отсутствующими значениями, я считаю "разреженную матрицу" эффективным способом хранения данных. Если все отсутствующие данные в вашем растре отличны от нуля, то использовать разреженную матрицу просто. Если в данных есть нули, то необходим один дополнительный шаг (включен ниже).
Сначала давайте создадим большой растр, в основном с 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)