是否可以在 data.cube R 中设置带有雪花模式的立方体?

Is it possible to set a cube with a snowflake schema in data.cube R?

或者,维度可以以某种方式嵌套在 data.cube 中吗?

给定以下示例(通过 R 上的 ?data.cube 访问,已安装 last branch of data.cube-oop package, by @jangorecki)我 post 代码和图像示例。

考虑到我想扩展多维数据集,添加一个新维度,将架构变成雪花状,因此对于每个地理位置,我会有另一组数据 (data.table) 来描述人口统计属性 (即基于性别、年龄等的人口)

图片

虚线:可能的新维度。

黑色:代码示例中的事实和维度。

绿色:将模式变成雪花的新维度。

代码

# multidimensional hierarchical data from fact and dimensions
X = populate_star(N = 1e3)
sales = X$fact$sales
time = X$dims$time
geography = X$dims$geography
# define hierarchies
time.hierarchies = list( # 2 hierarchies in time dimension
    "monthly" = list(
        "time_year" = character(),
        "time_quarter" = c("time_quarter_name"),
        "time_month" = c("time_month_name"),
        "time_date" = c("time_month","time_quarter","time_year")
    ),
    "weekly" = list(
        "time_year" = character(),
        "time_week" = character(),
        "time_date" = c("time_week","time_year")
    )
)
geog.hierarchies = list( # 1 hierarchy in geography dimension
    list(
        "geog_region_name" = character(),
        "geog_division_name" = c("geog_region_name"),
        "geog_abb" = c("geog_name","geog_division_name","geog_region_name")
    )
)
# create dimensions
dims = list(
    time = as.dimension(x = time,
                        id.vars = "time_date",
                        hierarchies = time.hierarchies),
    geography = as.dimension(x = geography,
                             id.vars = "geog_abb",
                             hierarchies = geog.hierarchies)
)
# create fact
ff = as.fact(
    x = sales,
    id.vars = c("geog_abb","time_date"),
    measure.vars = c("amount","value"),
    fun.aggregate = sum,
    na.rm = TRUE
)
# create data.cube
dc = as.data.cube(ff, dims)
str(dc)

与示例相关的其他问题是:

每个元素的预期值是多少?为什么 "time_week" = character() "time_date" = c("time_week","time_year") 代替 "time_week" = character() "time_date" = date() 以及为什么在 data.table 的列中这样命名? "time_quarter" = c("time_quarter_name"), "time_month" = c("time_month_name")

立方体模型是用户无需处理的底层结构。 data.cube-oop 使用以下 data model.
恰好是你所讨论的例子。您不能以这种方式在雪花模式中添加新维度。新维度必须连接到事实 table。雪花模式中不直接连接到事实 table 的表只是维度中的层次结构级别。在您的示例中,这意味着 客户维度 只是地理维度的更高级别属性。您最终可能会反其道而行之,创建客户维度并在更高级别的客户层次结构上保留地理属性。
无论您决定采用何种方式,您都必须从单个 table 创建尺寸(当然可以是相同宽度 table)。您不能通过单独提供其级别来构造维度,这会比用户最常处理的单个非规范化维度 table 更令人困惑。 因此,为了在客户维度中保留地理属性,只需为您的客户查找地理值 table 并为 as.dimension 提供新的 table。


关于问题的第二部分,层次结构列表定义了层次结构中属性之间的关系,而不是数据类型。 LHS 上的列名定义层次结构级别中的键列,而 RHS 定义将出现在该特定级别上的依赖属性。您基本上定义了哪个列在层次结构中的哪个级别,较低级别必须引用较高级别才能创建真正的层次结构。这是由数据的唯一性强制执行的,即每个 time_month.
必须只有一个 time_month_name 要更好地了解这种关系,请尝试以下操作:

library(data.cube)
X = populate_star(N = 1e3)
dc = as.data.cube(X)
dc$dimensions$time$levels

会打印时间维度上的所有层级,每个层级都是一个单独的table。