如何使用R data.table进行可扩展的聚合和计数
我正在尝试使用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
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