2017-06-25 44 views
1

我有一個從netCDF文件剪切(由shapefile掩蓋)的rasterbrick。我怎樣才能將這個rasterbrick轉換爲一個數據框,包括經度,緯度,時間和價值。 我知道我可以在那裏使用netCDF4包和expand.grid函數。 但是我必須在rasterbrick對象上創建這個數據框,而不是netcdf對象。如何從rasterbrick對象中創建一個長格式的數據幀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) 

現在,從這個s我怎樣才能得到一個數據幀df 使df就像

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 

。 我試過光柵點功能。

raspt<-rasterToPoints(s) 
    head(raspt) 

然而,數據幀爲擴展格式,我希望它在長格式,因爲在原始數據我有超過50000層的層作爲小時一次數據時間steps.So基本上,我想長數據幀,其中x, y,圖層作爲日期和價值。 謝謝你的幫助。

回答

0

你的問題更像是如何將數據幀從寬格式轉換爲長格式。我們可以使用tidyverse的功能來實現這一點。在下面的例子中,我給你的原始代碼添加了一些代碼。請注意,dplyrraster都具有select函數,因此請使用dplyr::select以避免混淆。 raspt2是最終輸出。

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

謝謝。它工作。 –