2

我正在处理一个购物篮分析项目,并且有一个数据包含一个表示 ID 的变量,而另一个数据只包含一个篮子中的一个项目。用户中有大约 5 万个独特的项目,但我在下面创建了一个简单的表格来说明。

library(data.table)
dt = data.table(ID = c("1","1","1","1","2","2","2"),
                product = c("Soda","Beer","Chips","Apple","Soda","Water","Juice"))
dt # original data looks like this

然后,我使用 dcast 函数将每个产品转换为具有二进制值的自己的列,表明它们是订单的一部分。

dcast.data.table(dt, ID ~ product, function(x) 1, fill = 0) 

正如我所提到的,由于内存限制,我无法在整个数据集上使用此方法(因为这将为每个产品创建 50K 列)。因此,我试图找到一个解决方案,其中 dcast 仅根据仅包含在 ID ==1 中的项目创建“产品”列(这意味着将排除“果汁”和“水”列)。另外,我正在使用一个相当大的 34MM 观察数据集,所以我正在寻找一个可以利用 data.table API 的有效解决方案,并且特别试图避免循环通过产品。我希望这个问题很清楚。谢谢。

4

1 回答 1

2

这有效:

dcast(dt, ID + product ~ factor(product, levels=product[ID==1]), fun.agg=length)

Using 'product' as value column. Use 'value.var' to override
   ID product Soda Beer Chips Apple NA
1:  1   Apple    0    0     0     1  0
2:  1    Beer    0    1     0     0  0
3:  1   Chips    0    0     1     0  0
4:  1    Soda    1    0     0     0  0
5:  2   Juice    0    0     0     0  1
6:  2    Soda    1    0     0     0  0
7:  2   Water    0    0     0     0  1
于 2017-08-20T20:23:55.293 回答