我正在开发一个市场购物篮分析项目,其数据包含一个代表一个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,并特别试图避免循环产品。我希望这个问题很清楚。谢谢。
答案 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