【问题标题】:How can I circumvent the 2^31 error thrown by the table() function?如何规避 table() 函数抛出的 2^31 错误?
【发布时间】:2021-08-22 18:53:24
【问题描述】:

我真的尽力通过 stackoverflow 搜索解决方案,但不幸的是我找不到合适的问题。因此,我必须自己提出一个问题。

我正在处理一个包含 sessionID 和主题的数据集。我想知道,一起购买了多少特定主题的物品。值得庆幸的是,堆栈溢出成员有一个好主意,结合使用 table() 函数和 crossprod() 函数。

topicPairs <- crossprod(table(as.data.frame(transactions)))

您可以在这里查看:How can I count, how many Items have been in one session together?

对于主题(或类型),这种方法非常有效,并且最终矩阵在存储使用方面非常小。

但是,现在我想知道,有多少艺术家在不同的会话中一起被购买。因此,我只是用艺术家(这里,我有 35727 个)替换流派(我有 360 个)并应用这个“table-crossprod-combination”。不幸的是,R 抛出以下错误消息:

attempt to make a table with >= 2^31 elements          

我也明白,发生了什么:表格函数为每个会话和流派生成一个条目。因为我只有 360 种不同的流派,所以这没有问题,因为会话数乘以 gernes 数小于 2^31。另一方面,我有 35727 位不同的艺术家。如果我将此数字乘以会话数,我会超过 2^31 个元素的数量。

这真的很可悲,因为解决方案非常聪明和简单,而且效果非常好。因此,我想问你,是否有办法绕过这个问题。当然,我的数据集非常大……但是有些人使用更大的数据集。

也许,我必须将数据集拆分为更小的子集,并在最后一步将它们合并在一起。但这并不容易,因为有一些艺术家出现,例如在子集 1 中,但不在子集 2 中。因此,我不能简单地按元素添加矩阵。

如果你能为这个问题提供一个解决方案,那就太棒了,因为它让我发疯,接近完美的解决方案。

非常感谢您!

【问题讨论】:

  • 您能否分两个阶段进行:按会话内的艺术家人数计算流派和会话总和?
  • 使用您之前链接的问题中的数据,您可以尝试xtabs(~ sessionID + topic, data=transactions, sparse=TRUE) 用于表格阶段。 Matrix 有一个用于稀疏矩阵的 crossprod 方法
  • 轰隆隆!它完美地工作!您的解决方案非常快,最终矩阵只需要 3 MB!非常感谢,干得好! :)
  • @user20650 您应该添加(转换)您的评论作为(到)答案,以便 OP 可以接受。

标签: r dplyr tidyverse tidyr data-wrangling


【解决方案1】:

如果您的结果矩阵很可能是稀疏的,因为零的百分比很高,如果可能的话,值得使用稀疏矩阵来节省空间。

所以对于你的data

sessionID <- c(1, 2, 2, 3, 4, 4, 5, 6, 6, 6)
topic <- c("rock", "house", "country", "rock", "r'n'b", "pop", "classic", "house", "rock", "country")
transactions <- cbind(sessionID, topic)

您可以使用xtabs 返回一个稀疏矩阵(而不是table 返回的密集矩阵),并使用Matrix 包来找到它的叉积并保留稀疏性。

tab <- xtabs(~ sessionID + topic, data=transactions, sparse=TRUE)
Matrix::crossprod(tab)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多