G'day, я работаю с большим набором данных с местоположением ~ 125 000 lon/lat с датой, для записей присутствия/отсутствия видов. В каждом месте я хочу выяснить, какая погода была в каждом месте на дату и в течение 3-х минут до даты. Для этого я загрузил ежедневные метеорологические данные для заданной погодной переменной (например, максимальной температуры) в течение 5-го периода, когда данные были сделаны. Я имею в общей сложности 1826 растровых файлов, все между 2-3 МБ.Работа с большим количеством данных и множеством растров в R?
Я планировал складывать все растровые файлы, а затем извлекать значение из каждого растра (1,826) для каждой точки. Это создаст массивный файл, который я могу использовать для поиска нужных мне дат. Это, однако, невозможно, потому что я не могу собрать столько растров. Я попытался разделить растры на стопки 500, это работает, но файлы, которые он производит, составляют около 1 ГБ и очень медленные (строки, 125 000, столбцы, 500). Кроме того, когда я пытаюсь привести все эти файлы в R, чтобы создать большой фрейм данных, он не работает.
Я хотел бы знать, есть ли способ работать с этим объемом данных в R, или если есть пакет, который я мог бы использовать, чтобы помочь. Могу ли я использовать пакет, например ff? Есть ли у кого-нибудь предложения по менее интенсивному методу делать то, что я хочу делать? Я подумал о чем-то вроде функции лапши, но никогда не использовал его раньше, и я не уверен, с чего начать.
Любая помощь будет действительно замечательной, заблаговременно за ваше время. Код, который я сейчас использую без успеха, приведен ниже.
С наилучшими пожеланиями, Адам
library(raster)
library(rgdal)
library (maptools)
library(shapefiles)
# To create weather data files, first set the working directory to the appropriate location (i.e., maxt)
# list of raster weather files
files<- list.files(getwd(), pattern='asc')
length(files)
memory.size(4000)
memory.limit(4000)
# read in lon/lat data
X<-read.table(file.choose(), header=TRUE, sep=',')
SP<- SpatialPoints(cbind(X$lon, X$lat))
#separate stacks into mannageable sizes
s1<- stack(files[1:500])
i1 <- extract(s1,SP, cellnumbers = True, layer = 1, nl = 500)
write.table(i1, file="maxt_vals_all_points_all_dates_1.csv", sep=",", row.names= FALSE, col.names= TRUE)
rm(s1,i1)
s2<- stack(files[501:1000])
i2 <- extract(s2,SP, cellnumbers = True, layer = 1, nl = 500)
write.table(i2, file="maxt_vals_all_points_all_dates_2.csv", sep=",", row.names= FALSE, col.names= TRUE)
rm(s2,i2)
s3<- stack(files[1001:1500])
i3 <- extract(s3,SP, cellnumbers = True, layer = 1, nl = 500)
write.table(i3, file="maxt_vals_all_points_all_dates_3.csv", sep=",", row.names= FALSE, col.names= TRUE)
rm(s3,i3)
s4<- stack(files[1501:1826])
i4 <- extract(s4,SP, cellnumbers = True, layer = 1, nl =325)
write.table(i4, file="maxt_vals_all_points_all_dates_4.csv", sep=",", row.names= FALSE, col.names= TRUE)
rm(s4,i4)
# read files back in to bind into final file !!! NOT WORKING FILES ARE TOO BIG!!
i1<-read.table(file.choose(),header=TRUE,sep=',')
i2<-read.table(file.choose(),header=TRUE,sep=',')
i3<-read.table(file.choose(),header=TRUE,sep=',')
i4<-read.table(file.choose(),header=TRUE,sep=',')
vals<-data.frame(X, i1, i2, i3 ,i4)
write.table(vals, file="maxt_master_lookup.csv", sep=",", row.names= FALSE, col.names= TRUE)
Я не могу вспомнить объем данных, которые я сделал, но мне повезло, что тон или растры в списке назвали. Возможно, вы поняли, что извлечение, вероятно, будет вашим узким местом, поэтому я постараюсь максимально ограничить его использование. Я экспериментировал с использованием семейства функций tapply/by/ddply для разделения большого массива данных на группы, затем используйте выдержку из каждой группы в соответствующем файле (который в вашем случае будет какой-то группировкой по дате), а затем повторно собирает , но у меня не было большого успеха. – blindjesse
Было бы достаточно просто прочитать эти файлы в массиве ff, а затем настроить извлечение для точек из них. Можете ли вы предоставить ссылку на один или два файла для работы с продуктами или с использованием данных с кодом? Кроме того, вы используете file.choose() для чтения файлов, но почему не имена, которые вы использовали для их записи? – mdsumner
Но почему их все равно читают? Почему бы не просто извлечь один растровый файл за раз? И, если конечный результат слишком велик, чтобы предварительно инициализировать, поскольку один объект просто добавляется к файлу по мере того, как вы идете. – mdsumner