G'day, estoy trabajando con un gran conjunto de datos con ~ 125,000 ubicaciones lon/lat con fecha, para registros de presencia/ausencia de especies. En cada lugar, quiero saber cómo era el clima en cada lugar en la fecha y durante los 3 meses anteriores a la fecha. Para hacer esto, he descargado datos meteorológicos diarios para una variable climática determinada (por ejemplo, temperatura máxima) durante el período de 5 años que se tomaron los datos. Tengo un total de 1.826 archivos de trama, todos entre 2-3mb.¿Trabajando con muchos datos y muchos rásteres en R?
Había planeado apilar todos los archivos de trama, luego extraer un valor de cada trama (1,826) para cada punto. Esto produciría un archivo masivo que podría usar para buscar las fechas que necesito. Esto, sin embargo, no es posible porque no puedo acumular tantos rásteres. Traté de dividir los rásteres en pilas de 500, esto funciona, pero los archivos que produce son de aproximadamente 1 GB y muy lento (filas, 125 000, columnas, 500). Además, cuando trato de traer todos estos archivos a R para crear un gran marco de datos, no funciona.
Me gustaría saber si hay una manera de trabajar con esta cantidad de datos en R, o si hay un paquete que podría usar para ayudar. ¿Puedo usar un paquete como ff? ¿Alguien tiene alguna sugerencia para un método menos intensivo de energía para hacer lo que quiero hacer? He pensado en algo así como una función de aplicación, pero nunca he usado una antes y no estoy realmente seguro de por dónde empezar.
Cualquier ayuda sería realmente genial, gracias de antemano por su tiempo. El código que estoy usando actualmente sin éxito está debajo.
Saludos cordiales, Adam
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)
No puedo recordar el tamaño de los datos a los que he hecho esto, pero he tenido suerte al traer una tonelada o rásteres a una lista con nombre. Es posible que haya descubierto que el extracto probablemente será su cuello de botella de tiempo, por lo que trataría de limitar su uso tanto como sea posible. He experimentado con el uso de la familia de funciones tapply/byddply para dividir un marco de datos grande en grupos, luego usar extracto en cada grupo en el archivo apropiado (que, en su caso, sería una especie de agrupación de fechas), luego volver a ensamblar , pero no he tenido mucho éxito con esto. – blindjesse
Sería lo suficientemente simple para leer esos archivos en una matriz ff, luego configurar la extracción para los puntos de aquellos. ¿Puede proporcionar un enlace a uno o dos archivos para trabajar con, o producir datos utilizables con código? Además, utiliza file.choose() para leer los archivos, pero ¿por qué no los nombres que utilizó para escribirlos? – mdsumner
Pero, ¿por qué leerlos todos a la vez de todos modos? ¿Por qué no simplemente extraer un archivo de trama a la vez? Y, si el resultado final es demasiado grande para preiniciarse como un solo objeto, solo agregue a un archivo a medida que avanza. – mdsumner