如果您可以发布我们可以直接运行的代码/数据,人们会更容易帮助您。最简单的方法是使用一个名为dput 的便捷 R 函数,该函数生成指令以精确地重新创建任何 R 对象。因此,您可以运行dput(MY_DATA),或者如果您的数据远大于展示您的问题所需的数据,请使用dput(head(MY_DATA)) 获取前六行,并将其输出粘贴到您的问题中。 </PSA>
这是生成示例数据的代码:
my_data <- data.frame(
stringsAsFactors = FALSE,
Start.date = c("11/12/2018", "07/03/2018", "04/06/2018", "26/07/2018"),
End.date = c("29/11/2019", "24/04/2019", "23/04/2019", "29/08/2019"),
Date.1 = c("08/03/2021", "08/03/2021", "08/03/2021", "08/03/2021"),
Date.2 = c(NA, "12/09/2016", "02/10/2017", "03/08/2015"),
Date.3 = c(NA, NA, "05/10/2018", "02/10/2017"),
Date.4 = c(NA, NA, NA, "23/01/2017")
)
这是一种 tidyverse 方法,首先使用 lubridate::dmy 将您的日/月/年日期转换为 R 日期类型的数据,然后将 Date.1 到 Date.4 中的每个日期与您的开始日期进行比较,最后显示如果有任何 1(在范围内)。
library(dplyr); library(lubridate)
my_data %>%
mutate(across(.fns = ~dmy(.x))) %>%
mutate(across(.cols = starts_with("Date"),
.fns = ~coalesce(.x >= Start.date & .x <= End.date, FALSE)*1)) %>%
mutate(Change = pmax(Date.1, Date.2, Date.3, Date.4))
coalesce(..., FALSE) 在这里用于将 NA 视为 FALSE。
(...)*1 将 TRUE/FALSE 转换为 1/0。
pmax(...) 获取最大的 1/0,即“是否有任何 1?”
编辑:保留日期列不变的替代方法:
my_data %>%
mutate(across(.fns = ~dmy(.x))) %>%
mutate(across(.cols = starts_with("Date"),
.names = "Check_{.col}",
.fns = ~coalesce(.x >= Start.date & .x <= End.date, FALSE)*1)) %>%
rowwise() %>%
mutate(Change = max(c_across(starts_with("Check")))) %>%
select(-starts_with("Check"))
Start.date End.date Date.1 Date.2 Date.3 Date.4 Change
<date> <date> <date> <date> <date> <date> <dbl>
1 2018-12-11 2019-11-29 2021-03-08 NA NA NA 0
2 2018-03-07 2019-04-24 2021-03-08 2016-09-12 NA NA 0
3 2018-06-04 2019-04-23 2021-03-08 2017-10-02 2018-10-05 NA 1
4 2018-07-26 2019-08-29 2021-03-08 2015-08-03 2017-10-02 2017-01-23 0