广格式数据和长格式数据哪个更有效率?

8

我很好奇,无论是解释性如何,将数据存储在长格式还是宽格式中哪种更有效率?我使用 object.size() 来确定内存中的大小,但它们没有显著差异(长格式在大小方面略微更有效),而且该值仅为估计。

除了原始大小之外,我还想知道哪种格式在建模时更高效。


换一种方式问,对于矩阵/数据处理来说,在1000 * 10的矩阵上操作更有效率还是在100 * 100的矩阵上操作更有效率? 再次感谢。 - MKao
2个回答

7
两个不同的 matrix 的内存使用量应该是相同的:
> object.size(long <- matrix(seq(10000), nrow = 1000))
40200 bytes
> object.size(square <- matrix(seq(10000), nrow = 100))
40200 bytes

如果效率的差异可以忽略不计,那么在使用R时的低效会远远抹平它们,所以几乎无需考虑,即使它们可以被测量。

对于data.frame而言,情况就非常不同了,因为它是作为一个vector列表的实现:

> object.size(as.data.frame(long))
41704 bytes
> object.size(as.data.frame(square))
50968 bytes

这将取决于你想要做什么,其时间效率可能会有所不同。

谢谢Michael,我已经对矩阵和数据框进行了完全相同的测试,并得出了相同的结论。我想知道当底层算法(例如LAPACK)处理矩阵时以及各种模型中使用的算法实现这两种不同格式的效率如何。 - MKao
哪个算法?请提供一些示例代码,以便比较效率。 - Michael Hoffman
我并不是在比较具体的例子,而是一般性地询问。在R中,大多数算法/操作使用哪种格式更受青睐?如果你要给别人建议,你会推荐哪一种,为什么? - MKao
"一般而言,并不存在“通用”的答案。在R中,对于大多数算法来说,两种格式并没有更受青睐的情况。" - Michael Hoffman

2
对于矩阵来说,这两种格式没有任何区别。对于一个由该矩阵构成的数据框(data.frame),同样如此。重新定义矩阵的形状只是分配维度属性...大多数情况下。
如果您要以某种方式对数据进行分类并添加其他信息,那么wide通常在存储方面更有效率,但是long通常处理效率更高。这不是long格式的必要属性,即它不太空间有效,但通常情况下,在wide中,您会在列名中拥有复合变量描述,这些描述将被分离并赋予新列或多个列在long中。因此,由于这些冗余,它将占用更多的空间。在处理方面,聚合长数据或选择特定案例进行删除比在具有多元列指定的wide格式中更容易。
如果数据不完全呈矩形(或立方体等)状态,则long也是这两种格式中最好的方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接