如何使用R中的sum和min进行聚合?

如何使用R中的sum和min进行聚合?,r,R,我很难按日期和SKU汇总不同的商店 我的示例数据如下所示: Date SKU Quantity Price 2010/01/01 52144 1 4.00 2010/01/01 87548 5 0.50 2010/01/01 47852 3 1.99 2010/01/01 52144 4 3.80 2010/01/02 87548 1 0.55 Date

我很难按日期和SKU汇总不同的商店

我的示例数据如下所示:

Date        SKU    Quantity Price 
2010/01/01  52144    1        4.00
2010/01/01  87548    5        0.50
2010/01/01  47852    3        1.99
2010/01/01  52144    4        3.80
2010/01/02  87548    1        0.55
 Date        SKU    Quantity Price 
2010/01/01  52144    5        3.80
2010/01/01  87548    5        0.50
2010/01/01  47852    3        1.99
2010/01/02  87548    1        0.55
我试着用agregate函数来表示如下:

Date        SKU    Quantity Price 
2010/01/01  52144    1        4.00
2010/01/01  87548    5        0.50
2010/01/01  47852    3        1.99
2010/01/01  52144    4        3.80
2010/01/02  87548    1        0.55
 Date        SKU    Quantity Price 
2010/01/01  52144    5        3.80
2010/01/01  87548    5        0.50
2010/01/01  47852    3        1.99
2010/01/02  87548    1        0.55

谢谢

使用
dplyr

library(dplyr)
group_by(df, Date, SKU) %>% 
    summarize(Quantity = sum(Quantity), Price = min(Price))
#         Date   SKU Quantity Price
# 1 2010/01/01 47852        3  1.99
# 2 2010/01/01 52144        5  3.80
# 3 2010/01/01 87548        5  0.50
# 4 2010/01/02 87548        1  0.55
还有
data.table

library(data.table)
setDT(df)[, .(Quantity = sum(Quantity), Price = min(Price)), by = .(Date, SKU)]
#          Date   SKU Quantity Price
# 1: 2010/01/01 52144        5  3.80
# 2: 2010/01/01 87548        5  0.50
# 3: 2010/01/01 47852        3  1.99
# 4: 2010/01/02 87548        1  0.55

在处理这类事情时,我发现这是一个很好的工具。假设您的数据存储在名为
df
的数据框中。您可以使用
SELECT
指令获取所需内容:

sqldf("select Date, SKU, sum(a.Quantity) as Quantity, min(a.Price) as price
       from df as a
       group by Date, SKU")
您可以使用标准SQL指令来操作、过滤或聚合存储在数据帧中的数据(这些数据帧的sqldf读起来就像是表一样)

dat <- read.table(header = TRUE, text = "Date        SKU    Quantity Price 
2010/01/01  52144    1        4.00
2010/01/01  87548    5        0.50
2010/01/01  47852    3        1.99
2010/01/01  52144    4        3.80
2010/01/02  87548    1        0.55")

tmp <- within(dat, {
  sums <- ave(Quantity, list(Date, SKU), FUN = sum)
  mins <- ave(Price, list(Date, SKU), FUN = min)
})

tmp[!with(tmp, duplicated(cbind(Date, SKU))), ]

#         Date   SKU Quantity Price mins sums
# 1 2010/01/01 52144        1  4.00 3.80    5
# 2 2010/01/01 87548        5  0.50 0.50    5
# 3 2010/01/01 47852        3  1.99 1.99    3
# 5 2010/01/02 87548        1  0.55 0.55    1

dat是否有一种方法可以使用
aggregate
dplyr
或其他函数/包“同时”完成此操作?(例如,一列的总和和另一列的最小值)不确定聚合,但
dplyr
数据。表
更容易找到一些指导原则。我们不会对其中任何一列进行投票,但是+1让我咳嗽发笑。