Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 查找多对矢量化日期之间的日期是否重叠_R_Date_Dplyr - Fatal编程技术网

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

R 查找多对矢量化日期之间的日期是否重叠,r,date,dplyr,R,Date,Dplyr,我试图找出一个日期是否存在于我的数据集中广泛的多对日期之间-我在这里给出的长度只是一个例子,最终的数字可能会更大或更小。不确定这是否是最明智的选择,但长时间工作似乎不起作用,这也是在SPSS中处理重叠日期和日期对的一种非常常见的方法,在SPSS中,当日期在这里时,可以计算多个变量,并通过每个编号的“集合”为您提供响应 以下是一个示例数据集: person key_date 1_end_date 2_end_date 3_end_date 4_end_date 1_start_date 2

我试图找出一个日期是否存在于我的数据集中广泛的多对日期之间-我在这里给出的长度只是一个例子,最终的数字可能会更大或更小。不确定这是否是最明智的选择,但长时间工作似乎不起作用,这也是在SPSS中处理重叠日期和日期对的一种非常常见的方法,在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") 
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          2019-05-23   2019-09-30   2016-07-22         
2      2 2019-06-07 2019-05-16 2019-06-07                 2019-05-16                           
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

测试
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
库(tidyverse)
结果%变异(跨越(以(“结束日期”)结束)
key_date=get(str_replace(cur_column(),“end”,“start”),
.names='{.col}_flag'))%>%
行()
突变(Flag1=sum(c_交叉(以(“flag”)结尾),na.rm=T))%>%
解组()%>%
选择(-U以(“标志”)结尾)
>结果$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
>结果
#一个tibble:3x11
人员键日期'1'结束日期'2'结束日期'3'结束日期'4'结束日期'1'开始日期'2'开始日期'3'开始日期'4'开始日期'Flag1
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 2019-06-07 2019-05-16 2019-06-07 NA 2019-05-16 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

为什么是第三个人?请重新检查!是的,第三个人错了,我很抱歉!这是一个很好的解决方案,比我以前的解决方案快得多。我稍微修改了一下,所以它被放在
~as.numeric
中,而不是
~ifelse
中。实际上,我还有其他非日期列使这一点复杂化,但修改了这个
get(str_replace(cur_column(),“end”,“start”)
真的很有用。谢谢!是的,as.numeric是一个更好的方法。这取决于人们习惯了什么。不过很高兴能提供帮助。即使是
as.numeric也不是必需的。当keydate位于两个组中时(如果可能的话),它会将标志转换为大于1的值啊,很有意思。我希望在一个普通的
mutate
命令中,这个功能可以工作:您可以创建一个逻辑参数,它将创建一个布尔值,而不必将它包装成
数值。它可以工作!实际上,在最后一步中,将布尔值包装成一个和,将其转换为数值。