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

Posted

技术标签:

【中文标题】如何从 R 中的 rasterbrick 对象创建长格式数据框【英文标题】:How to create a long format data-frame from rasterbrick object in R 【发布时间】:2017-11-28 18:09:20 【问题描述】:

我有一个从 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 个层作为 hrly 数据时间步长。所以基本上,我想要一个长数据帧,其中 x、y、层为日期和值。 感谢您的帮助。

【问题讨论】:

【参考方案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)

【讨论】:

以上是关于如何从 R 中的 rasterbrick 对象创建长格式数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何从 R 中的特定包中分离所有对象和方法? [复制]

——R的数据组织

——R的数据组织

如何在 R 中迭代地过滤列表中的列表或如何同时使用两个条件过滤 data.table,在运行时创建对象

如何绘制从使用 R 中的“caret”包创建的随机森林中选择的树

如何从r中的数据框创建栅格?