【发布时间】: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