如何用stars::st_as_stars将sf表格转为指定维度的stars立方体?
问题:sf数据框转stars立方体时指定维度失败
我需要将sf数据框转换为stars立方体,目标是避免空间多边形重复,要求:
- 维度:geometry、weekdays、hours
- 属性:population
但使用stars::st_as_stars时未能得到预期结果,还触发了错误。
示例代码
library(sf) library(stars) library(dplyr) # 创建示例空间数据 -------------------------------------------------- spatial_dim <- st_sf( ID = 1:3, geometry = list( st_polygon(list( cbind(c(0, 1, 1, 0, 0), c(0, 0, 1, 1, 0)) )), st_polygon(list( cbind(c(1, 2, 2, 1, 1), c(0, 0, 1, 1, 0)) )), st_polygon(list( cbind(c(2, 3, 3, 2, 2), c(0, 0, 1, 1, 0)) )) ) ) weekdays_dim <- data.frame(weekdays = c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")) hours_dim <- data.frame(hours = c("8am", "11am", "4pm", "11pm")) sf_dta <- spatial_dim |> cross_join(weekdays_dim)|> cross_join(hours_dim) |> mutate(population = rnorm(n(), mean = 1000, sd = 200)) |> select(everything(), geometry) # 尝试转换为stars对象,指定维度:geometry、weekdays、hours ----- st_as_stars(sf_dta, name = attr(dta, "sf_column"), dims = c('jour','geometry'))
错误信息
Error in st_as_stars.sf(sf_dta, name = attr(dta, "sf_column"), dims = c("jour", : ... arguments ignored
解决方案
你的代码存在几个明显问题,修正后即可生成符合要求的stars立方体:
- 参数误用:
st_as_stars.sf不支持dims参数,且代码中attr(dta, "sf_column")里的dta未定义(应为sf_dta),同时'jour'是拼写错误(应为'weekdays')。 - 转换逻辑偏差:要将非空间列作为独立维度,需先整理数据结构,再进行转换。
以下是两种可行的实现方式:
方法一:先转宽格式再构建stars对象
library(tidyr) # 将长格式数据转为宽格式,以weekdays和hours为组合列 sf_wide <- sf_dta |> pivot_wider( id_cols = c(ID, geometry), names_from = c(weekdays, hours), values_from = population ) # 转换为stars对象 stars_obj <- st_as_stars(sf_wide) # 将组合列拆分为独立的weekdays和hours维度 stars_obj <- st_set_dimensions( stars_obj, 2:ncol(stars_obj), names = c("weekdays", "hours"), values = list(weekdays_dim$weekdays, hours_dim$hours) )
方法二:直接用数组构造stars对象
# 提取各维度的唯一值 geo_unique <- unique(sf_dta$geometry) weekdays_unique <- unique(sf_dta$weekdays) hours_unique <- unique(sf_dta$hours) # 构造三维数组,对应geometry、weekdays、hours三个维度 pop_array <- array( sf_dta$population, dim = c(length(geo_unique), length(weekdays_unique), length(hours_unique)), dimnames = list( geometry = seq_along(geo_unique), weekdays = weekdays_unique, hours = hours_unique ) ) # 创建stars对象并绑定空间几何信息 stars_obj <- st_as_stars(pop_array) |> st_set_dimensions("geometry", values = geo_unique)
验证结果
执行以下代码确认stars对象结构是否符合预期:
# 查看对象结构 str(stars_obj) # 查询指定维度的人口数据 stars_obj[1, "Monday", "8am"]
内容的提问来源于stack exchange,提问作者Julien PRAMIL
相关产品推荐
相关产品推荐

