2017-06-25 2 views
1

J'ai une image matricielle rippée à partir d'un fichier netCDF (masqué par un fichier de formes). Comment puis-je convertir cette rasterbrick en une dataframe avec les colonnes lat, lon, time et value. Je sais que je peux le faire en utilisant le paquet netCDF4 et la fonction expand.grid là. Cependant, je dois créer cette base de données sur l'objet rasterbrick, pas sur l'objet netcdf.Comment créer une trame de données au format long à partir d'un objet rasterbrick dans R

library(raster) 
# Create a rasterStack object with time written to z dimension. 
r <- raster(ncol=3, nrow=4) 
s <- brick(lapply(1:3, function(x) setValues(r, runif(ncell(r))))) 
s<-setZ(s,as.Date('2000-1-1 00:00') + 0:2) 

maintenant de ce s comment puis-je obtenir un dataframe df de sorte que df est comme

head(df) 
    lon lat   dttm value 
1 226.5 54.0 1/1/2000 0:00  2 
2 223.5 55.5 1/2/2000 0:00  2 
3 225.0 55.5 1/3/2000 0:00  2 
4 219.0 57.0 1/4/2000 0:00  2 
5 220.5 57.0 1/5/2000 0:00  2 
6 222.0 57.0 1/6/2000 0:00  2 

. J'ai essayé la fonction de point à point.

raspt<-rasterToPoints(s) 
    head(raspt) 

Cependant, la trame de données est en format étendu, je le veux au format long parce que les données d'origine j'ai plus de 50000 couches comme steps.So temps de données HRLY essentiellement, je veux une longue trame de données avec x, y, couches comme date et valeur. Nous vous remercions de votre aide.

Répondre

0

Votre question est plutôt de savoir comment convertir la trame de données du format large au format long. Nous pouvons utiliser des fonctions de tidyverse pour y parvenir. Dans l'exemple suivant, j'ai ajouté quelques codes à vos codes d'origine. Notez que les deux dplyr et raster ont une fonction select, donc utilisez dplyr::select pour éviter les confusions. raspt2 est la sortie finale.

library(tidyverse) 
library(raster) 

# Create a rasterStack object with time written to z dimension. 
r <- raster(ncol = 3, nrow = 4) 
s <- brick(lapply(1:3, function(x) setValues(r, runif(ncell(r))))) 
s <- setZ(s, as.Date('2000-1-1 00:00') + 0:2) 

raspt <- rasterToPoints(s) 

# Create a data frame showing layer name and time 
dt <- data_frame(Layer = names(s), dttm = as.Date(getZ(s))) 

# Transform the data 
raspt2 <- raspt %>% 
    as_data_frame() %>% 
    rename(lon = x, lat = y) %>% 
    gather(Layer, value, -lon, -lat) %>% 
    left_join(dt, by = "Layer") %>% 
    dplyr::select(lon, lat, dttm, value) 
+0

Merci. ça a marché. –