【发布时间】:2015-11-13 21:17:57
【问题描述】:
描述这种节省/差异的一般公式是什么?
计算需要考虑的项目:
- 数组维数(标识列)
- 每个维度的大小(每个标识列中的唯一元素)
- 维度大小的乘积(数组元素的数量,上述的唯一组合)
- 每个维度的每个元素的
class(),当以二维而不是数组格式存储时(字符、整数、整数64、因子、双精度,很可能还有其他)
我正在为 R 包(半内部包)中的函数编写文档,我想充分描述这一点。根据我(或你!)可以在这里提出的建议,我什至可以编写一个函数来计算这种差异,这样用户就可以在两种方式都尝试之前看到节省的成本(数据集非常大!)。
编辑:
# starting object
d2 <- data.table(v=rnorm(10))
d2[,c("a","b","d","e"):=replicate(4, sample(1:20, 10), simplify=FALSE)]
setkey(d2, a, b, d, e)
# two casts to compare
d2.cast <- d2[CJ(a,b,d,e)] # 2D structure
dN.cast <- reshape2::acast(d2, a~b~d~e, value.var="v") # N-D structure
# compare sizes
print(object.size(d2.cast), units="Kb")
print(object.size(dN.cast), units="Kb")
打印(object.size(d2.cast), units="Kb")
236.4 KB
打印(object.size(dN.cast),单位=“Kb”)
81 KB
如果我使用了糟糕的术语,请更正它。我想更好地描述这种情况:)
【问题讨论】:
-
另外
array似乎有点小,但没那么多。只是一个简单的测试:object.size(lapply(1:100, function(i) lapply(1:100, function(j) rnorm(100))))和object.size(array(rnorm(100^3), dim = c(100, 100, 100)))。 (分别为 8484840 和 8000208 字节)。 -
@Molx 请参阅澄清编辑,并附有示例。 2D 对象要大得多,因为它必须通过定义数组的维度来重复仅声明一次的信息。
-
与 Jan 的回答相反,我想说:使用正确的工具来完成这项工作。如果您正在执行矩阵代数,则最好使用数组。如果您关心内存但不使用矩阵代数,也许您应该这样做。每当你有类似于观察的东西时使用 data.table,尤其是当你有分类/分组变量时。并在适当的地方使用列表或简单向量。所有这些类都便于分析。我不会将此作为答案发布,因为它本质上只是一种意见。
-
我在 data.table 中做所有事情,直到我需要将事情传递给 Stan 或 JAGS 以进行更多分析。需要 0,但在那些语言中,必须跳过 NA,所以我必须提前定义这些节点(嗯,我基本上需要对它们进行建模)。要点:我使用 data.table,但是当我去进行统计时,AFAIK 使用数组是有意义的。可以做 2D 的事情,但是在 2D 中分解出所有的 0 和 NA 效率很低。
标签: arrays r dataframe data.table data.cube