在 R 中使用 dplyr 在 case_when 语句中传递来自另一个数据帧的变量

pass variables from another dataframe in a case_when statement with dplyr in R

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

我修改了你的代码如下。请注意,我使用 data_frame 函数来避免创建因子列。对我来说,处理一个数据框更容易,所以我先使用 left_join 合并两个数据框。之后,我在 case_when 调用中使用 first 函数来确保只使用一个数字。 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