Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.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_Datatable_Dplyr_Lubridate - Fatal编程技术网

在R中使用间隔时间条件组合两个数据集(我希望避免组合,只进行唯一匹配)

在R中使用间隔时间条件组合两个数据集(我希望避免组合,只进行唯一匹配),r,datatable,dplyr,lubridate,R,Datatable,Dplyr,Lubridate,我有两个独立的数据集:df1和df2。我想创建一个新的数据集df3,如果日期时间彼此相差不超过20秒,它将使df1的endtime列与df2的sent列相匹配 df1 endtime ID 1/7/2020 1:35:08 AM A 1/7/2020 1:39:00 AM B 1/20/2020 1:45:00 AM C df2 sent

我有两个独立的数据集:df1和df2。我想创建一个新的数据集df3,如果日期时间彼此相差不超过20秒,它将使df1的endtime列与df2的sent列相匹配

 df1

 endtime                     ID

 1/7/2020  1:35:08 AM         A
 1/7/2020  1:39:00 AM         B
 1/20/2020 1:45:00 AM         C



 df2

sent                         ID

1/7/2020  1:35:20 AM          E
1/7/2020  1:42:00 AM          F
1/20/2020 1:55:00 AM          G
1/20/2020 2:00:00 AM          E
这是我想要的df3输出。只有一行,因为只有两个值与endtime和sent列的20秒内的条件相匹配。我想要独特的搭配,而不是组合。本质上是带有时间条件的合并

endtime                  sent 

1/7/2020 1:35:08 AM      1/7/2020  1:35:20 AM       
以下是dput:

df1

structure(list(endtime = structure(c(2L, 3L, 1L), .Label = c("1/10/2020 1:45:00 AM", 
"1/7/2020 1:35:08 AM", "1/7/2020 1:39:00 AM"), class = "factor"), 
ID = structure(1:3, .Label = c("A", "B", "C"), class = "factor")), class = "data.frame", row.names =   c(NA, 
 -3L))





 df2

 structure(list(sent = structure(c(3L, 4L, 1L, 2L), .Label = c("1/20/2020 1:55:00 AM", 
 "1/20/2020 2:00:00 AM", "1/7/2020 1:35:20 AM", "1/7/2020 1:42:00 AM"
 ), class = "factor"), ID = structure(c(1L, 2L, 3L, 1L), .Label = c("E", 
"F", "G"), class = "factor")), class = "data.frame", row.names = c(NA, 
-4L))
这就是我尝试过的:

我正在考虑执行左连接并匹配值,或者我可以使用merge(),但棘手的部分是将值与条件语句匹配。如有任何建议,我们将不胜感激

library(dplyr)
left_join(df1, df2)

可能是,我们需要进行
交叉
,然后在转换到
DateTime
类后进行
过滤

library(dplyr)
library(tidyr)
library(lubridate)
crossing(endtime = as.POSIXct(df1$endtime,format ="%m/%d/%Y %I:%M:%S %p" ), 
           sent = as.POSIXct(df2$sent, format = "%m/%d/%Y %I:%M:%S %p")) %>% 
     filter((endtime - seconds(20)) <= sent, 
                 (endtime + seconds(20)) >= (sent)) %>%
     mutate_all(format, format = "%m/%d/%Y %I:%M:%S %p") %>%
     distinct
# A tibble: 1 x 2
#  endtime                sent                  
#  <chr>                  <chr>                 
#1 01/07/2020 01:35:08 AM 01/07/2020 01:35:20 AM
库(dplyr)
图书馆(tidyr)
图书馆(lubridate)
交叉(endtime=as.POSIXct(df1$endtime,format=“%m/%d/%Y%I:%m:%S%p”),
sent=as.POSIXct(df2$sent,format=“%m/%d/%Y%I:%m:%S%p”)%%>%
筛选器((结束时间-秒(20))=(已发送))%>%
mutate_all(format,format=“%m/%d/%Y%I:%m:%S%p”)%%>%
不同的
#一个tibble:1x2
#发送的结束时间
#                                     
#1 01/07/2020 01:35:08 AM 01/07/2020 01:35:20 AM

有多少行?我这样问是因为一种方法是将
df1
中的每一行与
df2
中的每一行合并,然后删除条件不成立的所有行。。。这能回答你的问题吗?好的,谢谢你,Akrun,这会排除任何重复项吗?@TanishaHudson你可以在结束时添加
%%>%distinct
,只是,我在发送行中得到重复值,因为有多个结束时间与同一发送行匹配value@TanishaHudson
交叉
对“endtime”的每个值与“sent”的每个值进行完全扩展。如果您需要通过特定列获取distinct,请使用
distinct(sent,.keep_all=TRUE)
@TanishaHudson Yes如果您创建了一个对象,则使用原始数据执行
反连接可以获取其他行