是否可以在 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。
或者,维度可以以某种方式嵌套在 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。