You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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立方体:

  1. 参数误用:st_as_stars.sf不支持dims参数,且代码中attr(dta, "sf_column")里的dta未定义(应为sf_dta),同时'jour'是拼写错误(应为'weekdays')。
  2. 转换逻辑偏差:要将非空间列作为独立维度,需先整理数据结构,再进行转换。

以下是两种可行的实现方式:

方法一:先转宽格式再构建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 11:25:57