【问题标题】:Calculate average sales using criteria from one dataframe and aggregating in other data frame使用来自一个数据帧的标准并在另一个数据帧中聚合来计算平均销售额
【发布时间】:2019-03-20 11:26:45
【问题描述】:

我有df1$NextBizDay 有日期。 其他数据框df2 有两列df2$Date 和df2$Sales

现在我正在尝试使用df1$NextBizDay 中的日期计算平均销售额。由于df1$NextBizDay 可以有重复的日期,我使用as.data.frame(table(df1$NextBizDay))[,2] 计算了每个日期的频率

现在我需要加和除以得到平均销售额。

我知道aggregate(Sales~Date,df2,sum)[,2] 会给我每个日期的总销售额,但我不知道如何继续。

示例输入:

    df1$NextBizday  
    2018-10-22  
    2018-10-22  
    2018-10-23  
    2018-10-23  
    2018-10-23  
    2018-10-24  


    df2$Date    df2$Sales
    2018-10-22  1000
    2018-10-23  2000
    2018-10-24  3000
    2018-10-25  4000
    2018-10-26  5000
    2018-10-27  6000

预期输出 df1

    NextBizday AvgSales
    2018-10-22  500
    2018-10-22  500
    2018-10-23  666.6666667
    2018-10-23  666.6666667
    2018-10-23  666.6666667
    2018-10-24  3000

基本上我要做的是从 df2 中的 df1 中查找每个日期,然后将销售额除以 df1 中的日期频率。

【问题讨论】:

  • 请展示一个可重现的小例子和预期的输出

标签: r dataframe aggregate


【解决方案1】:

我们可以在两个数据集on 'NextBizday/Date' 列之间使用data.table 连接,然后通过取'Sales' 的sum 并除以数字来执行分配(:=)行数 (.N) 以创建“AvgSales”

library(data.table)
setDT(df1)[df2, AvgSales := sum(Sales)/.N, on = .(NextBizday = Date), by = .EACHI]
df1
#   NextBizday  AvgSales
#1: 2018-10-22  500.0000
#2: 2018-10-22  500.0000
#3: 2018-10-23  666.6667
#4: 2018-10-23  666.6667
#5: 2018-10-23  666.6667
#6: 2018-10-24 3000.0000

另一个选项是tidyverse,这可能更容易理解一些

library(dplyr)
df1 %>%
  # do a left join
  left_join(df2, by = c("NextBizday" = "Date")) %>%
  # grouped by NextBizday
  group_by(NextBizday) %>% 
  # divide the `first` value of 'Sales' by the number of rows `n()`
  transmute(AvgSales = first(Sales)/n())
# A tibble: 6 x 2
# Groups:   NextBizday [3]
#  NextBizday AvgSales
#  <date>        <dbl>
#1 2018-10-22     500 
#2 2018-10-22     500 
#3 2018-10-23     667.
#4 2018-10-23     667.
#5 2018-10-23     667.
#6 2018-10-24    3000 

数据

df1 <- structure(list(NextBizday = structure(c(17826, 17826, 17827, 
17827, 17827, 17828), class = "Date")), row.names = c(NA, -6L
), class = "data.frame")

df2 <- structure(list(Date = structure(c(17826, 17827, 17828, 17829, 
17830, 17831), class = "Date"), Sales = c(1000L, 2000L, 3000L, 
4000L, 5000L, 6000L)), row.names = c(NA, -6L), class = "data.frame")

【讨论】:

    【解决方案2】:

    试试aggregate:

    aggregate(Sales~Date, df2, FUN = mean, na.rm = T)[,2]
    

    【讨论】:

    • 我最初尝试过这个,但问题是日期在 df1 中重复,而在 df2 中没有。
    猜你喜欢
    • 2020-11-02
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 2020-10-12
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多