2016-05-30 3 views
2

В настоящее время я пытаюсь удалить значения NA из огромного растрового файла (наблюдения 1.9 * 10^7). В этих растров 99,9% - значения NA. Моя цель - удалить NA и создать файл .csv, содержащий все значения, отличные от NA. моя попытка выглядит следующим образом:удаление значений 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 выдает сообщение об ошибке, что она произошла неустранимая ошибка и заканчивается. Есть ли более простое и быстрое решение для его выполнения?

ответ

1

Вы можете использовать функцию rasterToPoints для этого.

library(raster) 
r <- raster() 
r[50:52] <- 1:3 
xyv <- rasterToPoints(r) 

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

Это работало отлично и быстро даже для моих самых больших растровых файлов! – 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) 

разреженных матриц хранить только ненулевые элементы, так, чтобы это разреженный нам нужно изменить НС в нулях. Если данные могут уже содержать нули, которые мы не хотим потерять, мы сохраняем местоположения нулей перед тем, как сделать матрицу разреженной.

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 

Теперь значения находятся в [email protected], а координаты сохраняются в @i и @j. Таким образом, чтобы сохранить в CSV-

my.df <- data.frame(x = xFromCol(my.raster, [email protected]), y = yFromRow(my.raster, [email protected]), [email protected]) 
my.df <- rbind(zeros, my.df) 
write.csv(my.df, file ="raster.csv", row.names = F) 
+0

Спасибо! Это работает очень хорошо, и редкая матрица - действительно аккуратная функция! – Thoegernh

Смежные вопросы