【问题标题】:Combining transactions from the same people on the same day合并同一天同一个人的交易
【发布时间】:2018-02-09 13:03:32
【问题描述】:

情况:我有一个包含交易的数据集 (transData)。每笔交易都有其对应的行,其中包含相关的列:transactionIDcustomerIDDatemoneySpend

简化示例:

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 的唯一组合:

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])
}

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

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

【问题讨论】:

  • 为了帮助我们帮助您,请提供可重现的示例。并使用microbenchmarkpackage 计算您的时间。你也应该尝试矢量化你的 for 循环
  • 您可以使用dput 提供可重现的示例
  • 所以您想通过 custumer_id 汇总您的资金支出?检查这个stackoverflow.com/questions/1660124/…

标签: r database transactions bigdata coding-efficiency


【解决方案1】:

在 data.table 中,简单地说:

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

【讨论】:

    【解决方案2】:

    我在这里使用 dplyr 包找到了基于一些 cmets 的解决方案。

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

    感谢您的考虑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 2020-10-20
      • 2022-10-25
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多