在R中使用间隔时间条件组合两个数据集(我希望避免组合,只进行唯一匹配)
我有两个独立的数据集:df1和df2。我想创建一个新的数据集df3,如果日期时间彼此相差不超过20秒,它将使df1的endtime列与df2的sent列相匹配在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
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如果您创建了一个对象,则使用原始数据执行反连接可以获取其他行