在同一天结合来自同一个人的交易

时间:2018-02-09 13:03:33

标签: r database transactions bigdata coding-efficiency

情况:我有一个包含事务的数据集( transData )。每个事务都有其行,其中包含相关列: transactionID customerID Date moneySpend

简化示例:

1; 101; 1/1/18; 42
2; 101; 1/1/18; 13
3; 102; 1/1/18; 32
4; 103; 1/1/18; 56
5; 103; 1/1/18; 85
6; 103; 2/1/18; 8
7; 101; 2/1/18; 23
8; 103; 2/1/18; 14
9; 103; 2/1/18; 35
10; 104; 2/1/18; 48

我需要的是:单个客户每天可以购买多件商品,但每件商品在交易数据集中都有自己的一行。但是,我需要将这些交易合并为一个交易,其中moneySpend是各个项目的总和。

简化示例:

1; 101; 1/1/18; 55
2; 102; 1/1/18; 32
3; 103; 1/1/18; 141
4; 103; 2/1/18; 77
5; 101; 2/1/18; 23
6; 104; 2/1/18; 48

(注意:transactionID并不重要,只要它是唯一的。)

我做了什么:使用plyr包中的ddply,我创建了一个表,用于对customerId和day的unqiue组合进行排序:

newTable <- ddply(transData, .(transData$customerID, transData$Date), nrow)

接下来,我在for循环中总结了这个事务:

for (i in 1:dim(newTable)[1]){ 
  trans = which(transData$customerID==newTable[i,1] & transData$Date==newTable[i,2])
  totalSpend[i]=sum(transData[trans,32:35])
}

问题:这对于需要处理的事务量来说太慢了。

有没有办法更有效地做到这一点(方式)?

2 个答案:

答案 0 :(得分:0)

在data.table中,只需:

transData[, newVar := sum(moneySpend), by = c("customerID", "Date")]

答案 1 :(得分:0)

我使用dplyr软件包找到了基于一些评论的解决方案。

transactions = transData %>% 
   group_by(customerID,Date) %>% 
   summarise(moneySpend = sum(moneySpend))

感谢您的思考。