如何用tidy/dplyr修改ERA5栅格经度范围(0-360转-180-180)
用tidyverse/dplyr转换ERA5数据经度范围(0-360 → -180-180)
完全可以用tidyverse生态工具实现这个转换,核心是将栅格数据转为tidy格式的数据框,调整经度值后按需转回栅格或保留tidy格式。以下是具体操作步骤:
1. 加载依赖包
library(terra) library(dplyr) library(tidyraster) # 可选,简化栅格与tidy格式的衔接
2. 转tidy格式并调整经度
方法一:用tidyraster简化操作
tidyraster能直接将SpatRaster转为符合tidy规范的tibble,方便后续dplyr操作:
era5_tidy <- era5_sr %>% as_tibble(xy = TRUE, na.rm = FALSE) %>% # 保留经纬度列(x为经度,y为纬度) mutate( # 经度转换规则:大于180的数值减去360,其余保持不变 x = ifelse(x > 180, x - 360, x) ) %>% arrange(x, y) # 按经纬度排序,保证空间顺序正确
方法二:直接用terra+dplyr
如果不想额外安装tidyraster,用terra原生的as.data.frame也能实现:
era5_df <- era5_sr %>% as.data.frame(xy = TRUE, na.rm = FALSE) %>% mutate( x = ifelse(x > 180, x - 360, x) ) %>% arrange(x, y)
3. (可选)转回SpatRaster格式
如果需要回到栅格格式,可通过terra重建栅格并填充数据:
# 定义新的空间范围(-180到180经度,-90到90纬度) new_extent <- ext(-180, 180, -90, 90) # 创建空栅格模板,匹配原数据的分辨率和坐标系 new_raster_template <- rast(new_extent, res = res(era5_sr), crs = crs(era5_sr)) # 将tidy数据框转回栅格 era5_sr_180 <- rasterize(era5_df[, c("x", "y")], new_raster_template, era5_df[, -c(1,2)])
注意事项
- 转换后必须按经度排序,否则空间数据的排列会出现混乱
- 对于多时相数据(如示例中的744个时间层),可根据需求用
pivot_longer转成长格式处理,再转回宽格式 tidyraster提供了更贴合tidyverse风格的栅格操作,能减少代码冗余
内容的提问来源于stack exchange,提问作者herakles_1950
相关产品推荐
相关产品推荐

