使用dcast.data.table仅从列值的子集转换为long到wide

时间:2017-08-20 19:58:40

标签: r binary data.table dcast

我正在开发一个市场购物篮分析项目,其数据包含一个代表一个ID的变量,另一个只包含一个购物篮中的一个项目。用户中有大约50K的独特项目,但我在下面创建了一个简单的表格以供说明。

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中包含的项目的列(意思是,#34; Juice"以及Water"将被排除在外)。此外,我正在使用一个相当大的34MM观测数据集,所以我正在寻找一个有效的解决方案,可以利用data.table API,并特别试图避免循环产品。我希望这个问题很清楚。谢谢。

1 个答案:

答案 0 :(得分: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