Рассчитать средние продажи, используя критерии из одного кадра данных и агрегируя в другом кадре данных - PullRequest
1 голос
/ 20 марта 2019

У меня есть 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

По сути, я пытаюсь найти каждую дату из df1 в df2 и разделить продажи на частоту дат в df1.

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Мы можем использовать data.table соединение между двумя наборами данных on столбца «NextBizday / Date», а затем выполнить присвоение (:=), взяв 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")
0 голосов
/ 20 марта 2019

Попробуйте aggregate:

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