如何避免 table() 函数抛出的 2^31 错误?
How can I circumvent the 2^31 error thrown by the table() function?
我真的尽了最大努力在 Whosebug 中搜索解决方案,但不幸的是我找不到 suitable 问题。因此,我不得不自己提出一个问题。
我正在处理包含会话 ID 和主题的数据集。我想知道一起购买了多少特定主题的商品。值得庆幸的是,堆栈溢出成员有一个好主意,使用 table() 函数和 crossprod() 函数的组合。
topicPairs <- crossprod(table(as.data.frame(transactions)))
您可以在这里查看:How can I count, how many Items have been in one session together?
对于主题(或流派),这种方法非常有效,并且最终矩阵在存储使用方面非常小。
不过,现在我想知道,在不同的session中,一共购买了多少艺术家。因此,我只是将流派(我有 360 个)替换为艺术家(这里,我有 35727 个)并应用此 'table-crossprod-combination'。不幸的是,R 抛出以下错误消息:
attempt to make a table with >= 2^31 elements
我也明白了,发生了什么:table 函数为每个会话和流派生成一个条目。由于我只有 360 个不同的流派,所以这没有问题,因为会话数乘以 gernes 数小于 2^31。另一方面,我有 35727 位不同的艺术家。如果我将这个数字乘以会话数,我就会超过 2^31 个元素的数量。
这真的很难过,因为这个解决方案非常聪明和简单,而且效果非常好。所以想请教各位,有没有办法绕过这个问题。当然,我的数据集很大......但是有人使用更大的数据集。
也许,我必须将数据集拆分成更小的子集,然后在最后一步将它们合并在一起。但这并不是那么容易,因为有一些艺术家出现了,例如。在子集 1 中但不在子集 2 中。因此,我不能简单地按元素添加矩阵。
如果你能为这个问题提供解决方案,那就太棒了,因为它让我发疯,接近完美的解决方案。
非常感谢您!
当您的结果矩阵很可能是稀疏的时,因为零的比例很高,如果可能的话,使用稀疏矩阵来保存 space 是值得的。
所以对于你的 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
到 return 稀疏矩阵(而不是 table
编辑的密集矩阵 return),并使用 Matrix
包找到这个的叉积,这将保留稀疏性。
tab <- xtabs(~ sessionID + topic, data=transactions, sparse=TRUE)
Matrix::crossprod(tab)
我真的尽了最大努力在 Whosebug 中搜索解决方案,但不幸的是我找不到 suitable 问题。因此,我不得不自己提出一个问题。
我正在处理包含会话 ID 和主题的数据集。我想知道一起购买了多少特定主题的商品。值得庆幸的是,堆栈溢出成员有一个好主意,使用 table() 函数和 crossprod() 函数的组合。
topicPairs <- crossprod(table(as.data.frame(transactions)))
您可以在这里查看:How can I count, how many Items have been in one session together?
对于主题(或流派),这种方法非常有效,并且最终矩阵在存储使用方面非常小。
不过,现在我想知道,在不同的session中,一共购买了多少艺术家。因此,我只是将流派(我有 360 个)替换为艺术家(这里,我有 35727 个)并应用此 'table-crossprod-combination'。不幸的是,R 抛出以下错误消息:
attempt to make a table with >= 2^31 elements
我也明白了,发生了什么:table 函数为每个会话和流派生成一个条目。由于我只有 360 个不同的流派,所以这没有问题,因为会话数乘以 gernes 数小于 2^31。另一方面,我有 35727 位不同的艺术家。如果我将这个数字乘以会话数,我就会超过 2^31 个元素的数量。
这真的很难过,因为这个解决方案非常聪明和简单,而且效果非常好。所以想请教各位,有没有办法绕过这个问题。当然,我的数据集很大......但是有人使用更大的数据集。
也许,我必须将数据集拆分成更小的子集,然后在最后一步将它们合并在一起。但这并不是那么容易,因为有一些艺术家出现了,例如。在子集 1 中但不在子集 2 中。因此,我不能简单地按元素添加矩阵。
如果你能为这个问题提供解决方案,那就太棒了,因为它让我发疯,接近完美的解决方案。
非常感谢您!
当您的结果矩阵很可能是稀疏的时,因为零的比例很高,如果可能的话,使用稀疏矩阵来保存 space 是值得的。
所以对于你的 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
到 return 稀疏矩阵(而不是 table
编辑的密集矩阵 return),并使用 Matrix
包找到这个的叉积,这将保留稀疏性。
tab <- xtabs(~ sessionID + topic, data=transactions, sparse=TRUE)
Matrix::crossprod(tab)