【问题标题】:pass variables from another dataframe in a case_when statement with dplyr in R使用 R 中的 dplyr 在 case_when 语句中从另一个数据帧传递变量
【发布时间】:2018-10-17 20:13:15
【问题描述】:

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

【问题讨论】:

  • 你只需要在case_when的每个子句末尾加逗号
  • 好收获!谢谢!

标签: r dplyr lubridate case-when


【解决方案1】:

我将您的代码修改如下。请注意,我使用了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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    相关资源
    最近更新 更多