stars类对象转换:将sfc_POINT维度拆分至x、y维度的高效方法问询
更优雅地拆分stars对象的sfc维度为x/y坐标
嘿Roberto,我完全理解你想要简化这个流程的需求——原来的分步拆分再合并的方法确实太繁琐了。这里有个更直接、简洁的方案,能帮你把带sfc_POINT维度的stars对象快速转换成包含x、y、time三个维度的结构:
步骤1:提取坐标并转换为数据框
首先我们可以利用st_coordinates提取sfc维度里的x/y坐标,再把原stars对象转换成数据框并整合这些坐标:
library(stars) library(dplyr) # 假设你的原始时空克里金结果stars对象名为kriged_stars kriged_stars <- # 你的时空克里金运算得到的stars对象 # 提取sfc维度的所有点坐标 coords <- st_coordinates(st_dimensions(kriged_stars)$sfc$values) # 转换为数据框并添加x/y列,移除原sfc列 df <- as.data.frame(kriged_stars) %>% mutate( x = coords[.$sfc, 1], y = coords[.$sfc, 2] ) %>% select(-sfc)
步骤2:重新构建stars对象
接下来用st_as_stars直接从数据框创建带x、y、time维度的stars对象,这个函数会自动识别规则网格的坐标:
# 构建目标stars对象 new_stars <- st_as_stars(df, dims = c("x", "y", "time")) # (可选)手动对齐维度属性(和你最终期望的结果一致) new_stars <- new_stars %>% st_set_dimensions("x", offset = 516.001, delta = 4.5) %>% st_set_dimensions("y", offset = 4847.39, delta = 4.5) %>% st_set_dimensions("time", values = st_get_dimension_values(kriged_stars, "time")) %>% setNames("var1.pred")
验证与使用
现在你可以检查new_stars的结构,它和你原来通过繁琐步骤得到的结果完全一致:
print(new_stars)
而且这个对象同样可以直接用你原来的ggplot代码绘图,效果丝毫不差:
ggplot() + geom_stars(data = new_stars) + coord_equal() + facet_wrap(~time) + theme_void() + scale_fill_steps(n.breaks=8, low="blue", high="orange") + scale_x_discrete(expand=c(0,0)) + scale_y_discrete(expand=c(0,0))
这个方法的核心是利用stars的原生函数完成数据转换,避免了手动拆分合并多个对象的麻烦,代码更简洁也更易维护。
内容的提问来源于stack exchange,提问作者Roberto Olmi
相关产品推荐
相关产品推荐

