Мы можем использовать 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")