【问题标题】:Tidyverse merging to datasets on most recent datesTidyverse 合并到最近日期的数据集
【发布时间】:2020-01-09 12:50:03
【问题描述】:

在 R 中,我有两个数据集,其中包含我试图合并的日期。首先是具有 start_dates 和 stop_dates 的环境条件。间隔时间长度不规则,从一天到一年不等。第二个数据集是具有给定日期的事件。我想合并它们,以便了解每个事件期间存在的环境条件。

在下面的示例中,合并结果应该是一个数据集,应该是 Event_data,其中包含一个显示每个日期的天气的新列。

require(tidyverse)

( Envir_data = data.frame(envir_start_date=as.Date(c("2017-05-31","2018-01-17", "2018-02-03"), format="%Y-%m-%d"),
                        envir_end_date=as.Date(c("2018-01-17", "2018-01-20", "2018-04-17"), format="%Y-%m-%d"),
                    weather = c("clear","storming","windy")) )

( Event_data = data.frame(event_date=as.Date(c("2017-06-03","2017-10-18", "2018-01-19"), format="%Y-%m-%d"),
                        cars_sold=c(2,3,7)) )

【问题讨论】:

  • 你能显示预期的输出吗
  • 你们太棒了!这很好用,谢谢。

标签: r date merge tidyverse


【解决方案1】:

SQL 允许您执行一个 between join 以获得您正在寻找的结果。

library(sqldf)

join <- sqldf(
  "SELECT L.Event_date, L.cars_sold, R.weather
  FROM Event_data as L
  LEFT JOIN Envir_data as R
  ON L.event_date BETWEEN R.envir_start_date AND R.envir_end_date"
  )

【讨论】:

  • 你们太棒了!这很好用,谢谢。
【解决方案2】:

我们使用seq.Date 根据Envir_data 中的数据生成日期序列。使用rowwise 仅基于行分组创建列表很重要。此操作会生成一个列表列。然后我们取消嵌套该列表列以使每个日期有一行。最后我们加入Event_data

Envir_data_2 <- Envir_data %>%
  rowwise() %>%
  mutate(event_date = list(seq.Date(envir_start_date, envir_end_date,
                                    by = "day"))) %>%
  unnest(event_date) %>%
  select(event_date, weather)

Event_data %>%
  inner_join(Envir_data_2)

#   event_date cars_sold  weather
# 1 2017-06-03         2    clear
# 2 2017-10-18         3    clear
# 3 2018-01-19         7 storming

【讨论】:

  • 你们太棒了!这很好用,谢谢。
猜你喜欢
  • 2020-02-12
  • 1970-01-01
  • 2017-08-26
  • 2018-08-15
  • 2022-01-03
  • 1970-01-01
  • 2018-04-11
  • 2016-01-30
  • 2018-03-21
相关资源
最近更新 更多