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
使用dplyr匹配两个日期字段_R_Date_Dplyr_Lubridate - Fatal编程技术网

使用dplyr匹配两个日期字段

使用dplyr匹配两个日期字段,r,date,dplyr,lubridate,R,Date,Dplyr,Lubridate,因此,我有一个这样的数据帧: ID key date1 001 02 2018-02-16 001 02 2018-02-19 001 03 2018-02-17 001 03 2018-02-22 001 04 2017-01-01 002 11 2019-12-21 002 12 2019-12-21 002 13 2019-12-22 和另一个数据帧(DF2) 因此,这项任务在概念上很简单: 我想查找DF1中存在的上一个日期到DF2中

因此,我有一个这样的数据帧:

ID   key  date1
001   02  2018-02-16
001   02  2018-02-19
001   03  2018-02-17
001   03  2018-02-22
001   04  2017-01-01
002   11  2019-12-21
002   12  2019-12-21
002   13  2019-12-22
和另一个数据帧(DF2)

因此,这项任务在概念上很简单:

我想查找DF1中存在的上一个日期到DF2中的每个日期。

我这是什么意思?例如,在DF2中,我们看到日期
2018-02-20
,以及相应的密钥和ID。因此我转到DF1并找到匹配的ID和密钥,这给了我两种可能性。我需要的是前一个,所以不是后一个。因此它将是
2018-02-19
。我最终会计算出天数

最终df应如下所示:

ID   key  date2           date1   day_diff
001   02  2018-02-20 2018-02-19          1
001   03  2018-03-22 2018-02-22         28
002   13  2019-12-22 2019-12-22          0
002   13  2019-12-21         NA         NA
同样,我们只需要DF2每行中的日期之前的日期。如果没有以前的日期,也需要返回NA。

这是否有效:

library(dplyr)
df1 %>% group_by(ID, key) %>% filter(date1 == max(date1)) %>% 
fuzzyjoin::fuzzy_right_join(df2, by = c('ID' = 'ID', 'key' = 'key', 'date1' = 'date2'), match_fun = list(`==`, `==`, `<=`)) %>% 
ungroup() %>% select('ID' = ID.y, 'key' = key.y, date2, date1) %>% mutate(day_diff = as.numeric(date2 - date1))
# A tibble: 4 x 5
  ID    key   date2      date1      day_diff
  <chr> <chr> <date>     <date>        <dbl>
1 001   02    2018-02-20 2018-02-19        1
2 001   03    2018-03-22 2018-02-22       28
3 002   13    2019-12-22 2019-12-22        0
4 002   13    2019-12-21 NA               NA
库(dplyr)
df1%%>%group_by(ID,key)%%>%filter(date1==max(date1))%%>%
fuzzyjoin::fuzzy\u right\u join(df2,by=c('ID'='ID','key'='key','date1'='date2'),match\u fun=list(`==`,`==`,`,`%
解组()%%>%select('ID'=ID.y,'key'=key.y,date2,date1)%%>%mutate(day_diff=as.numeric(date2-date1))
#一个tibble:4x5
ID密钥日期2日期1天\u差异
1 001   02    2018-02-20 2018-02-19        1
2 001   03    2018-03-22 2018-02-22       28
3 002   13    2019-12-22 2019-12-22        0
4 002 13 2019-12-21不适用
library(dplyr)
df1 %>% group_by(ID, key) %>% filter(date1 == max(date1)) %>% 
fuzzyjoin::fuzzy_right_join(df2, by = c('ID' = 'ID', 'key' = 'key', 'date1' = 'date2'), match_fun = list(`==`, `==`, `<=`)) %>% 
ungroup() %>% select('ID' = ID.y, 'key' = key.y, date2, date1) %>% mutate(day_diff = as.numeric(date2 - date1))
# A tibble: 4 x 5
  ID    key   date2      date1      day_diff
  <chr> <chr> <date>     <date>        <dbl>
1 001   02    2018-02-20 2018-02-19        1
2 001   03    2018-03-22 2018-02-22       28
3 002   13    2019-12-22 2019-12-22        0
4 002   13    2019-12-21 NA               NA