在 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
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