如何使用R data.table进行可扩展的聚合和计数

如何使用R data.table进行可扩展的聚合和计数,r,count,data.table,aggregate,R,Count,Data.table,Aggregate,我正在尝试使用data.table聚合和计算表的新值,如下所示: CARD_KEY Nationality OCCUPATION PURCHASE_AMOUNT PRODUCT 1 Poland Student $100 Shoes 1 Poland Student $150 Shoes 1 Poland Student $50

我正在尝试使用data.table聚合和计算表的新值,如下所示:

 CARD_KEY Nationality OCCUPATION  PURCHASE_AMOUNT PRODUCT
    1      Poland       Student     $100          Shoes
    1      Poland       Student     $150          Shoes
    1      Poland       Student     $50           Bags
    2      UK           Accountant  $10           Shoes
    2      UK           Accountant  $40           Supermarket
我正在寻找的输出如下:

 CARD_KEY Nationality OCCUPATION   Total_Purchases   Purchase_Ratio.Shoes Purchase_Ratio_Super...
    1      Poland       Student     $350                    $250/$350              0          
    2      UK           Accountant   $350                    $10/$350              $40/$350          
下面是我所做的。它可以工作,但是有没有更理想的方法来编写此代码:

result = tmp[,Total_Purchases:=list(sum(as.numeric(Purchase_Amount)))][,
         Purchases_Ratio:=sum(as.numeric(Purchase_Amount)/Total_Purchases),by=c("CARD_KEY")][,
         count(.SD,"PRODUCT"),by=c('CARD_KEY','Nationality','OCCUPATION','Purchases_Ratio')][,
         Purchases_Freq:=freq/sum(freq),by=CARD_KEY]
result_reshaped<-reshape(result,direction="wide",
                 idvar=c('CARD_KEY','Nationality','OCCUPATION','freq'),
                 timevar='PRODUCT')
result=tmp[,总采购量:=列表(金额(如数字(采购金额)))[,,
采购比率:=金额(如数字(采购金额)/采购总额),按=c(“卡钥匙”)[,,
计数(.SD,“产品”),按=c(‘卡钥匙’、‘国籍’、‘职业’、‘购买率’)[,,
购买频率:=Freq/sum(Freq),按=CARD\u KEY]

正如评论中提到的,你做了很多错事

  • 首先-在使用
    data.table
    时,不要使用
    重塑
    ,您可以使用效率更高的
    dcast.data.table
    功能来实现这一点

  • 第二-通过引用分配时(即使用
    :=
    ),无需在
    列表中或创建副本(即,使用
    为什么要使用基本R
    重塑
    。这是R中存在的最低效的函数之一。您听说过
    ?dcast.data.table
    。另外,您从哪里获取
    计数
    ?还有,
    频率是什么?您没有这样的列,您不需要删除“$”在任何合理的聚合之前签名?也不需要分配给
    结果
    ,因为您使用
    :=
    引用分配count来自plyr库。freq是count函数的输出。我确实删除了$。我只是将其留作说明。谢谢您的评论。非常有用。dcast的一个问题是我不知道我如何使用它来获得不同的“value.vars”。请注意,上面我想为每个产品提供购买比率、购买频率等。您展示的内容很棒,但只适用于购买量。有意义吗?有任何进一步的精彩建议@David arenburg?::)非常感谢您的帮助。
    tmp[, PURCHASE_AMOUNT := as.integer(gsub("\\$", "", PURCHASE_AMOUNT))][, 
          Total_Purchases := sum(PURCHASE_AMOUNT)]
    
    dcast.data.table(tmp, 
                     CARD_KEY + Nationality + OCCUPATION + Total_Purchases ~ PRODUCT, 
                     function(x) round(sum(x)/sum(tmp$PURCHASE_AMOUNT), 2),
                     value.var = "PURCHASE_AMOUNT")
    
    #    CARD_KEY Nationality OCCUPATION Total_Purchases Bags Shoes Supermarket
    # 1:        1      Poland    Student             350 0.14  0.71        0.00
    # 2:        2          UK Accountant             350 0.00  0.03        0.11