根据日期范围和名称提取一系列值

Pulling a range of Values based on date range AND name

我正在尝试计算特定网站在客户活跃的给定时间段内的平均费用。数据保存在 2 个单独的表中

df1=

ClientID DateStart DateEnd Site
1 2020-02-13 2020-02-15 Albury
2 2020-02-14 2020-02-15 wodonga

df2=

Site Date Expense
Albury 2020-02-13 4
Albury 2020-02-14 5
Albury 2020-02-15 7
Albury 2020-02-16 4
Albury 2020-02-17 4
Wodonga 2020-02-14 100
Wodonga 2020-02-15 120

我希望如此

ClientID DateStart DateEnd Site Avg_exp
1 2020-02-13 2020-02-16 Albury 5.3
2 2020-02-14 2020-02-15 wodonga 110

我在 R 中使用 SQLDF,并提出了以下步骤:

sqldf("select avg(Expense) from df1,df2 WHERE df2.Site= 'Albury' AND df2.Date >= df1.DateStart AND df2.Date <= df1.DateEnd")

这给出了客户 1 活跃期间 Albury 的平均费用 - 这是我想附加到 ClientID 1 的内容。

为此,我尝试在 df1 中添加一个新列 returns 平均费用 if df1.Site = df2.Site

df1$Avg_exp = sqldf("select avg(Expense) from df1,df2 WHERE df2.Site= df1.Site AND df2.Date >= df1.DateStart AND df2.Date <= df1.DateEnd")

这只是计算整个 df2 的平均费用。

我也试过只发布一个新的 df,我在其中按 clientID 对平均费用进行了分组,目的是然后将其加入到 DF1

df3=sqldf("select avg(Expense) from df1,df2 WHERE df2.Site= df1.Site AND df2.Date >= df1.DateStart AND df2.Date <= df1.DateEnd GROUP BY df1.ClientID")

但我收到错误“参数 5 的长度不为 2”

有什么建议吗?

谢谢!

您真正需要的是对两个表使用左连接。 所以你会得到类似的东西:

SELECT df1.ClientId, df1.DateStart, df1.DateEnd, df1.Site, AVG(df1.Expense) as Avg_exp
FROM df1
LEFT JOIN df2 ON df2.Site = df1.Site
     WHERE df2.Date BETWEEN df1.DateStart AND df1.DateEnd
GROUP BY df1.ClientId, df1.DateStart, df1.DateEnd, df1.Site

通过比较字符串执行上述操作可能不会给您预期的结果。例如,'wodonga' 与 'Wodonga' 不同。