使用基于数值变量最大值的因子变量级别创建数据框

时间:2013-05-31 18:02:18

标签: r dataframe

我使用聚合来创建一个接近我需要的数据框。但是,我遇到的问题正是我想要的。

假设原始数据如下:

data


 Order Item Price Quantity
     1    A    10        1 
     1    A    20        3 
     2    B    30        1 
     2    C    40        1 
     3    B    30        1 
     4    C    50        1 
     5    A    10        1 
     5    B    40        2 

我现在根据项目和订单总结价格和数量。

data.new <- aggregate(cbind(price, quantity) ~ Order + Item, sum, data = data)
data.new

╔═══════╦══════╦═══════╦══════════╗
║ Order ║ Item ║ Price ║ Quantity ║
╠═══════╬══════╬═══════╬══════════╣
║     1 ║ A    ║    30 ║        4 ║
║     2 ║ B    ║    30 ║        1 ║
║     2 ║ C    ║    40 ║        1 ║
║     3 ║ B    ║    30 ║        1 ║
║     4 ║ C    ║    50 ║        1 ║
║     5 ║ A    ║    10 ║        1 ║
║     5 ║ B    ║    40 ║        2 ║
╚═══════╩══════╩═══════╩══════════╝

这适用于Order = 1,但我需要每一行都是唯一的Order。因此,我希望按每个唯一订单的最高价格汇总项目。项目只是一个高级别的因素,可以说明驱动独特订单的大部分销售价格的原因。它应该如下所示:

data.new <- ????
data.new

╔═══════╦══════╦═══════╦══════════╗
║ Order ║ Item ║ Price ║ Quantity ║
╠═══════╬══════╬═══════╬══════════╣
║     1 ║ A    ║    30 ║        4 ║
║     2 ║ C    ║    70 ║        2 ║
║     3 ║ B    ║    30 ║        1 ║
║     4 ║ C    ║    50 ║        1 ║
║     5 ║ B    ║    50 ║        3 ║
╚═══════╩══════╩═══════╩══════════╝

1 个答案:

答案 0 :(得分:2)

这是使用 plyr 的一个选项(在众多选项中):

ddply(data,.(Order),
      summarise,
      Item = unique(Item[which.max(Price)]),
      Price = sum(Price),
      Quantity = sum(Quantity))

  Order Item Price Quantity
1     1    A    30        4
2     2    C    70        2
3     3    B    30        1
4     4    C    50        1
5     5    B    50        3

这假设您不会在两个不同的项目之间进行最大价格分割。