r - 查找多对矢量化日期之间的日期是否重叠

标签 r date dplyr

我正在尝试查找数据集中多对日期之间是否存在日期 - 我在这里给出的长度只是一个示例,最终的数字可能更大或更小。不确定这是否是最明智的选择,但纵向工作似乎不起作用,这也是在 SPSS 中处理重叠日期和日期对的一种非常常见的方法,其中您可以对多个变量进行数字化,因为日期在这里并且它通过每个编号的“集合”来给您一个响应。

这是一个示例数据集:

  person   key_date 1_end_date 2_end_date 3_end_date 4_end_date 1_start_date 2_start_date 3_start_date 4_start_date
1      1 2019-09-30 2019-05-23 2019-09-30 2016-07-22       <NA>   2019-05-23   2019-09-30   2016-07-22         <NA>
2      2 2019-06-07 2019-05-16 2019-06-07       <NA>       <NA>   2019-05-16         <NA>         <NA>         <NA>
3      3 2020-03-09 2016-06-02 2019-08-09 2020-05-27 2020-02-12   2016-06-02   2019-08-09   2020-05-27   2020-03-09

test <- structure(list(person = 1:3, key_date = structure(c(18169, 18054,18330), class = "Date"), `1_end_date` = structure(c(18039, 18032,16954), class = "Date"), `2_end_date` = structure(c(18169, 18054,18117), class = "Date"), `3_end_date` = structure(c(17004, NA,18409), class = "Date"), `4_end_date` = structure(c(NA, NA, 18304), class = "Date"), `1_start_date` = structure(c(18039, 18032,16954), class = "Date"), `2_start_date` = structure(c(18169,NA, 18117), class = "Date"), `3_start_date` = structure(c(17004,NA, 18409), class = "Date"), `4_start_date` = structure(c(NA,NA, 18330), class = "Date")), row.names = c(NA, 3L), class = "data.frame") 

预期的输出只是一个二进制标志,指示 key_date 存在于任何 start_dateend_date 对之间。在给出的示例中,这意味着 person 1 和 3。有什么想法可以做到这一点吗?这真的效率低下吗?

最佳答案

tidyverse 方法

library(tidyverse)
result <- test %>% mutate(across(ends_with("end_date"), ~ 
                         key_date <= . & key_date >= get(str_replace(cur_column(), "end", "start")),
                       .names = '{.col}_flag')) %>%
  rowwise() %>%
  mutate(Flag1 = sum(c_across(ends_with("flag")), na.rm = T)) %>%
  ungroup() %>%
  select(-ends_with("flag"))

> result$Flag1
[1] 1 0 0

完整的输出看起来像

> result
# A tibble: 3 x 11
  person key_date   `1_end_date` `2_end_date` `3_end_date` `4_end_date` `1_start_date` `2_start_date` `3_start_date` `4_start_date` Flag1
   <int> <date>     <date>       <date>       <date>       <date>       <date>         <date>         <date>         <date>         <dbl>
1      1 2019-09-30 2019-05-23   2019-09-30   2016-07-22   NA           2019-05-23     2019-09-30     2016-07-22     NA                 1
2      2 2019-06-07 2019-05-16   2019-06-07   NA           NA           2019-05-16     NA             NA             NA                 0
3      3 2020-03-09 2016-06-02   2019-08-09   2020-05-27   2020-02-12   2016-06-02     2019-08-09     2020-05-27     2020-03-09         0

关于r - 查找多对矢量化日期之间的日期是否重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67199498/

相关文章:

r - 单击 rmarkdown::beamer_presentation 时突出显示 kable 表的表条目

r - 使用 knititations 在 RMarkdown 文档中包含引用书目

r - 将 R 输出导出到 Excel

R - 按 dplyr 分组,仅当组中的所有成员重复时才删除重复项

r - 将多个函数映射到 R 中的字符串向量的最有效方法是什么?

Java Date.parse IllegalArgument

linux - BASH:在变量中设置最后一个星期一的日期

php - 上周,本周 (php)

r - top_n 与 r 中的顺序

r - 在 R 和 dplyr 中,使用 "mutate"和 "mutate"将多次调用 "across"替换为一次调用