R - 使用with()和by()子集DF

时间:2016-02-18 05:44:40

标签: r

今天是我在R的第一天 - 你的建议会有很长的路要走。

我正在尝试根据预订活动创建用户的汇总视图。

在预订表中提取唯一的CustID。为客户创建新的DF。

customer <- with(BookingsDF,data.frame(CustID=sort(unique(CustID))))

向客户表中的每个CustID添加交易次数。

customer <- cbind(customer, NumberOrders = with(BookingsDF, 
  as.numeric (by (id, CustID, function(x) length(unique(x))))))

这会生成错误消息

  

data.frame(...,check.names = FALSE)中的错误:参数暗示   行数不同:373545,391910

这没有意义 - 2个查询如何输出不同的长度?考虑第一个查询提取唯一的CustID,第二个查询提取每个唯一的CustID已预订的次数。

谢谢。

决定:感谢您的帮助。我已将代码更新为:

customer <- booked.dt[,{
  FirstPurchaseDate = .SD[which.min(CreatedDate)]
  LastPurchaseDate = .SD[which.max(CreatedDate)]
  NumberOrders = .N
  TotalAmount = sum(Price)
} , by = CustID]

不幸的是,这需要很长时间才能完成。所以我不得不通过SQL进行操作,然后将聚合数据上传到R.

1 个答案:

答案 0 :(得分:1)

有很多软件包可以解决这个问题;我更喜欢data.table。基本思想是分裂,计算和重新加入。声明data.table,然后计算每个唯一客户ID的行数,并将其存储在customer中。

在此示例中,请尝试此

library(data.table)
bookings.DT <- data.table(BookingsDF)
customer <- bookings.DT[,.N,by="CustID"]

您应该会在CustID中看到Ncustomer的表格。这假设数据是长格式的。如果没有,请参阅reshape2