如何在R的dplyr中通过case_when从另一个数据框传递变量
解决你的数据框日期传递问题
嘿,这是个很常见的dplyr操作需求,我来帮你搞定它!
首先,你的核心需求是把单行数据框df2里的delivery_date值,用到df1的mutate逻辑里生成对应的send_date。因为df2只有一行,我们可以直接提取它的日期值来使用,下面是两种可行的方案:
方案一:提前提取日期值(推荐,代码更清晰)
先把df2里的日期单独存成一个变量,这样在case_when里使用起来更直观,也避免后续df2结构变化时出问题:
library(dplyr) library(lubridate) # 从df2提取单行的delivery_date值 base_date <- df2$delivery_date test_d <- df1 %>% mutate(send_date = case_when( type == "invite" ~ base_date, type == "reminder" ~ base_date + days(2), type == "final" ~ base_date + days(5) # 这里替换成你实际需要的日期偏移逻辑 ))
方案二:直接在case_when中引用df2的列
如果确定df2永远只有一行,也可以直接在case_when里用df2$delivery_date,R会自动把这个长度为1的向量循环匹配到df1的每一行:
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(5) # 补全你的final类型逻辑 ))
验证结果
不管用哪种方案,最终生成的test_d都会是这样的结果:
type send_date 1 invite 2018-05-07 2 reminder 2018-05-09 3 final 2018-05-12
需要注意的是,如果后续df2变成多行数据框,第二种方案就会出错,所以第一种提前提取的方式更稳妥哦!
内容的提问来源于stack exchange,提问作者Sharedobe
相关产品推荐
相关产品推荐

