如何从 R 中的 rasterbrick 对象创建长格式数据框
How to create a long format data-frame from rasterbrick object in R
我有一个从 netCDF 文件中剪裁下来的光栅砖(由 shapefile 遮盖)。我如何将此 rasterbrick 转换为包含 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 数据时间 steps.So 基本上,我想要一个带 x 的长数据帧, y,图层作为日期和值。
谢谢你的帮助。
您的问题更像是如何将数据帧从宽格式转换为长格式。我们可以使用 tidyverse
中的函数来实现这一点。在下面的示例中,我在您的原始代码中添加了一些代码。请注意 dplyr
和 raster
都有一个 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)
我有一个从 netCDF 文件中剪裁下来的光栅砖(由 shapefile 遮盖)。我如何将此 rasterbrick 转换为包含 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 数据时间 steps.So 基本上,我想要一个带 x 的长数据帧, y,图层作为日期和值。 谢谢你的帮助。
您的问题更像是如何将数据帧从宽格式转换为长格式。我们可以使用 tidyverse
中的函数来实现这一点。在下面的示例中,我在您的原始代码中添加了一些代码。请注意 dplyr
和 raster
都有一个 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)