代码之家  ›  专栏  ›  技术社区  ›  Sharedobe

在R中带有dplyr的case\u when语句中从另一个数据帧传递变量

  •  4
  • Sharedobe  · 技术社区  · 6 年前

    df1和df2是派生自其他逻辑的两个独立数据帧。

    试验数据:

    df1 <- data.frame(type= c("invite","reminder", "final"))
    
    df2 <- data.frame(delivery_date = date('2018-05-07'))
    

    问题:如何将变量的值从df2传递到df1(如何使此代码工作?)

    #pseudocode: 
    
    library(dplyr)
    library(lubridate)
    
    test_d<- df1 %>%
       mutate(send_date = case_when(
              type == "invite" ~ df2$delivery_date
              type == "reminder"  ~ df2$delivery_date + days(2)
              type == "final"  ~  df2$delivery_date + days(4) 
              )
    )
    

    我想要的数据框:

    type       send_date
    invite    2018-05-07   #pass the value of delivery_date from df1 
    reminder  2018-05-09   #add 2 days based on the value of delivery_date in df1
    final     2018-05-11   #add 4 days based on the value of delivery_date in df1
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   www    6 年前

    我修改了您的代码如下。请注意,我使用了 data_frame 函数以避免创建因子列。对我来说,在一个数据帧上工作更容易,所以我使用 left_join 首先合并两个数据帧。之后,我使用 first 中的函数 case_when 打电话确认只使用了一个号码。 df3 是最终输出。

    library(dplyr)
    library(lubridate)
    
    df1 <- data_frame(type= c("invite","reminder", "final"))
    
    df2 <- data_frame(delivery_date = date('2018-05-07'))
    
    df3 <- df1 %>%
      left_join(df2 %>% mutate(type = "invite"), by = "type") %>%
      mutate(delivery_date = case_when(
        type %in% "invite"    ~ first(delivery_date),
        type %in% "reminder"  ~ first(delivery_date) + days(2),
        type %in% "final"     ~ first(delivery_date) + days(4) 
      )) %>%
      rename(send_date = delivery_date)
    
    df3
    # # A tibble: 3 x 2
    #   type     send_date 
    #   <chr>    <date>    
    # 1 invite   2018-05-07
    # 2 reminder 2018-05-09
    # 3 final    2018-05-11