2013-10-28 7 views
8

Ho un frame di dati in cui i valori (l) sono specificati per le coordinate cartesiane (x, y) come nel seguente esempio di lavoro minimo.Come creare un raster da un frame di dati in r?

set.seed(2013) 
df <- data.frame(x = rep(0:1, each=2), 
        y = rep(0:1, 2), 
        l = rnorm(4)) 

df 
# x y   l 
# 1 0 0 -0.09202453 
# 2 0 1 0.78901912 
# 3 1 0 -0.66744232 
# 4 1 1 1.36061149 

Voglio creare un raster utilizzando il pacchetto raster, ma la mia lettura della documentazione non ha rivelato un metodo semplice per il caricamento dei dati in forma che ce l'ho nelle cellule raster. Ho trovato un paio di modi per farlo usando i loop, ma ho il sospetto che ci sia un approccio molto più diretto che mi manca.

risposta

14

Qui è un approccio, tramite SpatialPixelsDataFrame

library(raster) 
# create spatial points data frame 
spg <- df 
coordinates(spg) <- ~ x + y 
# coerce to SpatialPixelsDataFrame 
gridded(spg) <- TRUE 
# coerce to raster 
rasterDF <- raster(spg) 
rasterDF 
# class  : RasterLayer 
# dimensions : 2, 2, 4 (nrow, ncol, ncell) 
# resolution : 1, 1 (x, y) 
# extent  : -0.5, 1.5, -0.5, 1.5 (xmin, xmax, ymin, ymax) 
# coord. ref. : NA 
# data source : in memory 
# names  : l 
# values  : -0.6674423, 1.360611 (min, max) 

help('raster') descrive un certo numero di metodi per creare un raster da oggetti di varie classi.

+0

La risposta che segue è più concisa e probabilmente più efficiente dal punto di vista computazionale. @Gregory pls riconsiderare qual è la risposta corretta! – RobinLovelace

16

una soluzione più facile esiste come

library(raster) 
dfr <- rasterFromXYZ(df) #Convert first two columns as lon-lat and third as value     
plot(dfr) 
dfr     
class  : RasterLayer 
dimensions : 2, 2, 4 (nrow, ncol, ncell) 
resolution : 1, 1 (x, y) 
extent  : -0.5, 1.5, -0.5, 1.5 (xmin, xmax, ymin, ymax) 
coord. ref. : NA 
data source : in memory 
names  : l 
values  : -2.311813, 0.921186 (min, max) 

Plot

Inoltre, è possibile specificare la stringa CRS. Discussione dettagliata disponibile here.