【问题标题】:R - subsetting DF using with() and by()R - 使用 with() 和 by() 子集 DF
【发布时间】:2016-02-18 05:44:40
【问题描述】:

今天是我在 R 的第一天 - 您的建议将大有帮助。

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

在 bookings 表中提取唯一的 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。

【问题讨论】:

  • by 的输出将是 list

标签: r


【解决方案1】:

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

在这个例子中,试试这个

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 2019-03-18
    相关资源
    最近更新 更多