首页 文章

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

提问于
浏览
2

我正在开发一个市场购物篮分析项目,其数据包含一个代表一个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中包含的项目创建“产品”列(意思是,“Juice”和Water“列将被排除在外) . 此外,我正在使用一个相当大的34MM观测数据集,所以我正在寻找一个有效的解决方案,可以利用data.table API,并特别试图避免循环产品 . 我希望这个问题很明确 . 谢谢 .

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
    

相关问题