首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有任何方法将两个数据帧按日期范围连接起来?

是否有任何方法将两个数据帧按日期范围连接起来?
EN

Stack Overflow用户
提问于 2020-10-20 00:16:47
回答 2查看 105关注 0票数 1

我有两个数据框架,第一个数据集是公司每项产品在接下来27天内预测需求的记录,如下所示:

代码语言:javascript
复制
library(tidyverse)
library(lubridate)

daily_forecast <- data.frame(
  item=c("A","B","A","B"),
  date_fcsted=c("2020-8-1","2020-8-1","2020-8-15","2020-8-15"),
  fcsted_qty=c(100,200,200,100)
) %>% 
  mutate(date_fcsted=ymd(date_fcsted)) %>% 
  mutate(extended_date=date_fcsted+days(27))

另一个数据集是每个项目的实际每日需求:

代码语言:javascript
复制
actual_orders <- data.frame(
  order_date=rep(seq(ymd("2020-8-3"),ymd("2020-9-15"),by = "1 week"),2),
  item=rep(c("A","B"),7),
  order_qty=round(rnorm(n=14,mean=50,sd=10),0)
)

我试图完成的是在第一个数据集中获取date_fcstedextended_date中每个项目的实际总需求,然后将它们连接起来以计算预测精度。

使用tidyverse的解决方案将受到高度赞赏。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-20 01:31:08

您也可以按照@Gregor的建议尝试fuzzy_join。我添加了一个行号列,以确保您有独立于item和日期范围的唯一行(但这可能不需要)。

代码语言:javascript
复制
library(fuzzyjoin)
library(dplyr)

daily_forecast %>%
  mutate(rn = row_number()) %>%
  fuzzy_left_join(actual_orders,
                  by = c("item" = "item",
                         "date_fcsted" = "order_date",
                         "extended_date" = "order_date"),
                  match_fun = list(`==`, `<=`, `>=`)) %>%
  group_by(rn, item.x, date_fcsted, extended_date, fcsted_qty) %>%
  summarise(actual_total_demand = sum(order_qty))

输出

代码语言:javascript
复制
     rn item.x date_fcsted extended_date fcsted_qty actual_total_demand
  <int> <chr>  <date>      <date>             <dbl>               <dbl>
1     1 A      2020-08-01  2020-08-28           100                 221
2     2 B      2020-08-01  2020-08-28           200                 219
3     3 A      2020-08-15  2020-09-11           200                 212
4     4 B      2020-08-15  2020-09-11           100                 216
票数 2
EN

Stack Overflow用户

发布于 2020-10-20 01:05:03

您可以尝试以下方法:

代码语言:javascript
复制
library(dplyr)

daily_forecast %>%
  left_join(actual_orders, by = 'item') %>%
  filter(order_date >= date_fcsted & order_date <= extended_date) %>%
  group_by(item, date_fcsted, extended_date, fcsted_qty) %>%
  summarise(value = sum(order_qty))

#  item  date_fcsted extended_date fcsted_qty value
#  <chr> <date>      <date>             <dbl> <dbl>
#1 A     2020-08-01  2020-08-28           100   179
#2 A     2020-08-15  2020-09-11           200   148
#3 B     2020-08-01  2020-08-28           200   190
#4 B     2020-08-15  2020-09-11           100   197
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64436758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档