【问题标题】:Populate one data frame with data from the another data frame用来自另一个数据帧的数据填充一个数据帧
【发布时间】:2021-12-25 23:35:05
【问题描述】:

我必须对包含日期的 dfs(dfA 和 dfB)进行分析,并且我想在 dfA 中的某些列中填充一些基于一些简单操作的 dfB 数据。

假设df A具有以下结构:

Location Mass  Date

A        0.18  10/05/2001 

B        0.25  15/08/2006

C        0.50  17/12/2019

Df B 包含

Date  Event  Time

其中 date 的日期范围很广。我想在 dfB 中查找 dfA 中的日期,并根据简单的日期操作从 dfB 检索“事件”和“时间”数据,例如从 dfA 上的“日期”中显示的一、二或三天获取数据,给我类似的东西:

Location Mass  Date        Event 1 Event 2 Event 3 

A        0.18  10/05/2001   (w)    (x)     (y)

B        0.25  15/08/2006   (z)    (z1)    (z2)

其中 (w) 将是从 dfA (09/05/2001) 中指定的“日期”开始的“日期”(-1) 天从 dfB 中的“事件”中提取的数据,然后 (x) 将检索数据从 dfB 中的“事件”在“日期”(-2)天从 df A(08/05/2001)等等。

我相信使用 dplyr 和 lubridate 可以解决这个问题。

【问题讨论】:

标签: r dplyr lubridate


【解决方案1】:

您可以添加具有滞后日期(第 1 天、第 2 天等)的虚拟变量,然后使用一系列 left_join 来实现预期结果。请看下面的代码:

library(lubridate)
library(tidyverse)

# Simulation
dfa <- tibble(location = LETTERS[1:4],
              mass = c(0.18, 0.25, 0.5, 1),
              date = dmy(c("10/05/2001", "15/08/2006", "15/07/2006", "17/12/2019")))

dfb <- tibble(date = dmy(c("9/05/2001", "13/08/2006", "13/07/2006", "14/12/2019")),
              event = c("day-1a", "day-2a", "day-2b", "day-3"))

# Dplyr-ing, series of left_joins
dfc <- dfa %>%
  mutate(date_1 = date - 1,
         date_2 = date - 2,
         date_3 = date - 3) %>%
  left_join(dfb, by = c("date_1" = "date")) %>%
  rename(event1 = event) %>%
  left_join(dfb, by = c("date_2" = "date")) %>%
  rename(event2 = event) %>%
  left_join(dfb, by = c("date_3" = "date")) %>%
  rename(event3 = event) %>%
  select(-starts_with("date_"))
  
dfc

输出:

# A tibble: 4 x 6
  location  mass date       event1 event2 event3
  <chr>    <dbl> <date>     <chr>  <chr>  <chr> 
1 A         0.18 2001-05-10 day-1a NA     NA    
2 B         0.25 2006-08-15 NA     day-2a NA    
3 C         0.5  2006-07-15 NA     day-2b NA    
4 D         1    2019-12-17 NA     NA     day-3 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 2019-08-20
    • 2021-07-02
    相关资源
    最近更新 更多