根据几个变量进行匹配,有些是完全匹配的,有些是一系列变化的

Match according to several variables, some exactly and some with a range of variation

提问人:CLARA 提问时间:7/13/2023 最后编辑:r2evansCLARA 更新时间:7/13/2023 访问量:25

问:

match1 <- semi_join(datosvendor, datosclient,
                    by=c("DAY","HOUR","MINUTE","ANUM","BNUM","DURATION"))

我想根据上一行代码中出现的变量(日、小时、分钟、数字 A、数字 B 和持续时间)以精确的方式在两个数据帧的调用之间进行匹配。但我还想添加另一个变量来进行匹配,但不是以精确的方式:我还想添加调用的秒数(“SECOND”),但考虑到我想不以精确的秒数进行匹配,而是以 3 秒的范围内进行匹配上下。也就是说,我希望数据帧的调用与另一个数据框的调用相匹配,同时考虑到它们最多可以上下变化三秒(但它们必须在所有其他列中完全匹配)。

注意:我的两个数据框没有相同的维度。

添加这个新变量以使其与所有其他变量进行匹配的语法如何?

R 数据帧 匹配

评论

0赞 Jon Spring 7/13/2023
您正在寻找一种“非等价”联接类型,该联接由 、 、 支持。 支持“不等式联接”,但要求您在联接步骤之前预先计算联接的最小值和最大值范围。无论您使用哪种方法,在您的示例中,我建议将年/日/小时/分钟/秒合并为 POSIXct 日期时间,否则您将错过 5:00:01 pm 和 4:59:59 pm 之间的连接,这只有两秒钟的距离,但具有不同的小时和分钟。data.tablesqldffuzzyjoindplyr 1.1.0+
1赞 Jon Spring 7/13/2023
在 dplyr 1.1.0+ 中,假设您在两个表中都已将年/日/小时/分钟/秒转换为日期时间“DATETIME”,您可以使用类似semi_join(datosvendor, datosclient |> mutate(DATETIME_low = DATETIME - 3, DATETIME_high = DATETIME + 3), join_by(BNUM, DURATION, DATETIME >= DATETIME_low, DATETIME <= DATETIME_high))
1赞 Jon Spring 7/13/2023
顺便说一句,您可以使用类似的东西来制作新的 DATETIME 列。datosvendor <- datosvendor |> mutate(DATETIME = lubridate::ymd_hms(paste(YEAR, DAY, HOUR, MINUTE, SECOND))

答: 暂无答案