如何从R中的rasterbrick对象创建长格式数据框

时间:2017-06-25 21:04:19

标签: r dataframe raster netcdf4

我有一个从netCDF文件中剪切的栅格砖(由shapefile屏蔽)。如何将此栅格砖转换为具有列lat,lon,time和value的数据帧。 我知道我可以使用netCDF4包和expand.grid函数。 但是我必须在rasterbrick对象上创建这个数据帧,而不是netcdf对象。

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层作为小时数据时间步骤。所以基本上,我想要一个长的数据帧,x,y,层为日期和价值。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

您的问题更像是如何将数据帧从宽格式转换为长格式。我们可以使用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)