R - 使用键连接数据帧,然后使用近似日期

2024-04-02

问题

我正在尝试使用 3 个 ID 列(或者 1 列,如果我将 3 个粘贴在一起)合并两个数据帧,其中之一是日期时间变量,并且两个数据帧之间的变化最多为 1 秒。

背景

我有两个从带有交易记录的库中提取的数据帧。由于某种原因,签出和签入是分开记录的,没有唯一的“交易 ID”来匹配它们。我想匹配他们。 “签出”数据框包含已签出的每个项目的记录,包括到期日期(应归还项目的时间)。 “签入”数据框记录了签入的每个项目,包括截止日期。不幸的是,我很难将这些数据框合并在一起,原因有两个:

  1. 没有唯一的事务 ID 来匹配表。 (为什么?我不知道。)
  2. 对于同一交易,每笔交易的“due_date”字段最多可能相差一秒。

due_date 的变化看似随机发生,因此没有任何方法可以确定哪些记录的两个 due_date 相等或相差 1 秒。否则,我可以减去(或添加)一秒以使它们相等。

The Data

这是我正在使用的数据示例:

library(dplyr)
library(lubridate)

check_in <- tribble(
  ~ patron_id, ~item_id, ~checked_in, ~due_date,
    "A", "Z", "2018-04-16 07:00:00", "2018-04-16 08:00:00",
    "A", "Y", "2018-04-17 07:30:01", "2018-04-17 08:30:01",
    "B", "X", "2018-04-17 07:00:01", "2018-04-17 08:00:01",
    "B", "Z", "2018-04-17 08:00:01", "2018-04-17 09:00:01",
    "B", "Z", "2018-04-09 09:00:01", "2018-04-09 10:00:01",
    "C", "V", "2018-04-09 09:00:01", "2018-04-09 10:00:01",
    "C", "X", "2018-04-09 09:00:01", "2018-04-09 10:00:01")

check_out <- tribble(
  ~ patron_id, ~item_id, ~checked_out, ~due_date,
    "A", "Z", "2018-04-16 06:00:00", "2018-04-16 08:00:01",
    "A", "Y", "2018-04-17 06:30:01", "2018-04-17 08:30:00",
    "B", "X", "2018-04-17 06:00:01", "2018-04-17 08:00:00",
    "B", "Z", "2018-04-17 07:00:01", "2018-04-17 09:00:00",
    "B", "Z", "2018-04-09 08:00:01", "2018-04-09 10:00:01",
    "C", "V", "2018-04-09 08:00:01", "2018-04-09 10:00:01",
    "C", "X", "2018-04-09 08:00:01", "2018-04-09 10:00:00")

check_in$due_date <- ymd_hms(check_in$due_date)
check_in$checked_in <- ymd_hms(check_in$checked_in)

check_out$due_date <- ymd_hms(check_out$due_date)
check_out$checked_out <- ymd_hms(check_out$checked_out)

读者 ID 是借阅图书的人的唯一 ID。项目 ID 是图书的唯一 ID。已签出是指图书被签出的时间。签入是指图书签入的时间。到期日期是指图书到期的时间。

对于此示例数据,我将所有截止日期设置为退房日期后 2 小时。我还将入住日期设置为退房日期后 1 小时。

所需输出

我想从 check_in 数据框中获取“checked_in”变量,并将其与 check_out 数据框中的相应事务相匹配。输出将是这样的,但可能带有某种生成的交易 ID:

desired_output <- tribble(
  ~patron_id, ~item_id, ~checked_out, ~checked_in, ~due_date,
    "A", "Z", "2018-04-16 06:00:00", "2018-04-16 07:00:00", "2018-04-16 08:00:01",
    "A", "Y", "2018-04-17 06:30:01", "2018-04-17 07:30:01", "2018-04-17 08:30:00",
    "B", "X", "2018-04-17 06:00:01", "2018-04-17 07:00:01", "2018-04-17 08:00:00",
    "B", "Z", "2018-04-17 07:00:01", "2018-04-17 08:00:01", "2018-04-17 09:00:00",
    "B", "Z", "2018-04-09 08:00:01", "2018-04-09 09:00:01", "2018-04-09 10:00:01",
    "C", "V", "2018-04-09 08:00:01", "2018-04-09 09:00:01", "2018-04-09 10:00:01",
    "C", "X", "2018-04-09 08:00:01", "2018-04-09 09:00:01", "2018-04-09 10:00:00")

我尝试过的

尝试#1:

我尝试过有条件合并,如中所述this https://stackoverflow.com/a/42847041/9017311帖子,进行以下修改:

check_out <- check_out %>%
             mutate(transaction_id = paste(patron_id,"-",item_id,sep=""))
check_in <- check_in %>%
              mutate(transaction_id = paste(patron_id,"-",item_id,sep=""))

output <- merge(check_out, check_in, by="transaction_id")[abs(difftime(check_out$due_date, check_in$due_date, units = "secs"))<=1,]

但此方法不处理相同的事务 ID(显然),并且创建的记录比实际多。

尝试#2:

恢复到原始数据帧,我尝试了解决方案这个帖子 https://stackoverflow.com/a/5426704/9017311,进行以下修改:

output <- cbind(check_out, check_in[ 
                  sapply(check_out$due_date, 
                    function(x) which.min(abs(difftime(x, check_in$due_date)))), ])

但此方法不考虑“交易 ID”,或者更确切地说,不考虑我用来创建某种唯一 ID 的两个关键变量。因此,输出错误。

其他不成功的尝试:

  1. 模糊连接如中提到的本文 https://www.r-bloggers.com/in-between-a-rock-and-a-conditional-join/。 (以及提到的其他基于 R 的解决方案。)
  2. This response https://stackoverflow.com/a/37300633/9017311,它使用过滤。

不幸的是,我无法让这些发挥作用。我对这些方法的运作方式没有信心,而且它没有产生我想要的结果。很可能是用户错误,因为其他人似乎也能够实现类似的功能。

Thanks

如果您能帮助我,请先谢谢您。我倾向于使用 Tidyverse 提供的工具,但我也愿意使用其他工具和方法。我试图确保在寻找其他解决方案时尽职尽责,但如果您发现我错过了重要的帖子,请将其标记为重复并将该帖子发送给我。

如果我可以提供任何其他信息或澄清上述任何细节,请告诉我。


会这样:

inner_join(check_in, check_out, by = c("patron_id", "item_id")) %>%
  filter(abs(difftime(due_date.y, due_date.x, units= "secs"))<=as.difftime(1, format = "%S", units = "secs"))

说明:简单连接+过滤时间差

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R - 使用键连接数据帧,然后使用近似日期 的相关文章

  • R中添加水印

    我在用magickR中的库 我想在一些图片上添加水印 I used image annotate功能如下 img lt image read C Users Maydin Desktop manzara png image annotate
  • 如何提取与 R 中主题 ID 列表匹配的行?

    我有一个包含许多主题 ID 的数据框 每个主题都有重复观察 我还有一个单独的数据框 其中只有一个主题 ID 列表 我想从更大的数据框中匹配和提取 如何以允许我引用不同数据帧中的SubjectID列表的方式编写代码 不确定我是否完全理解这个问
  • 从 R 中的向量中选择所有可能的元组

    我正在尝试用 R 编写一个程序 当给定一个向量时 将返回所有可能的tuples http en wikipedia org wiki Tuples该向量中的元素 例如 元组 c a b c c a b c 出租车 c a c c b c c
  • 将 Instagram/youtube 嵌入 Shiny R 应用程序

    我想通过点击图表来播放 Instagram 或 Youtube 视频 例如显示异常值等 到目前为止 明确告诉 Shiny 视频内容是有效的 require shiny require ggplot2 data df lt data fram
  • 如何对同一列上的数据帧列表中的所有数据帧进行排序?

    我有一个数据框列表dataframes list 举个例子 我把dput dataframes list 在底部 我想对列列表中的所有数据框进行排序enrichment 我可以对一个数据框进行排序 first dataframe lt da
  • 在 R 中创建一个运行计数变量?

    我有一个足球比赛结果的数据集 我希望通过创建一组类似于世界足球 Elo 公式的运行评级来学习 R 我遇到了麻烦 在 Excel 中看似简单的事情在 R 中并不完全直观 例如 4270 个观察中的前 15 个具有必要的变量 date t 1
  • 如何用外部图像填充地图边界?

    我正在创建一张带有州边界的巴西地图 这可以直接使用ggplot2 and geom sf 然而 这一次 我不想用数据填充每个状态的颜色 而是想用外部图像 png 填充每个状态的边界 类似于this https online olivet e
  • R中的一元加/减是什么?

    来自 R 的详细信息部分Syntax http stat ethz ch R manual R patched library base html Syntax html帮助页面 定义了以下一元和二元运算符 他们被列出 在优先级组中 从最高
  • R foreach问题(某些进程返回NULL)

    我遇到了问题foreach我正在 R 中使用的程序的一部分 该程序用于运行不同参数的模拟 然后将结果返回到单个列表 然后用于生成报告 当并非所有分配的模拟运行都在报告上实际可见时 就会出现问题 从各方面来看 似乎只有分配的运行的一个子集实际
  • 在 R 中向散点图添加线条

    如何向图表添加线条 我做了以下 dat lt data frame xvar 1 20 rnorm 20 sd 10 yvar 1 20 rnorm 20 sd 10 zvar 1 20 rnorm 20 sd 10 plot dat 1
  • 通过间接引用列来修改数据框中的某些值

    我正在整理一些数据 我们将失败的数据分类到垃圾箱中 并按批次计算每个分类箱的有限产量 我有一个描述排序箱的元表 这些行按升序测试顺序排列 一些排序标签带有非语法名称 sort tbl lt tibble tribble weight lab
  • 如何使用 usmap 标记数字而不是名称?

    我知道 usmap 有一个选项label in plot usmap 我想标记一些数字 而不是状态名称 我想 usmap 中应该有与州质心坐标相关的数据 但我不知道如何找到它 如果我能得到 坐标然后我可以用它来标记数字geom text 这
  • R 中的快速 QR 分解

    我有大量矩阵 需要对其执行 QR 分解并存储生成的 Q 矩阵 进行归一化 以便 R 矩阵在其对角线上具有正数 除了使用之外还有其他方法吗qr 功能 这是工作示例 system time Parameters for the matrix t
  • 在 R 中绘制 Likert 变量的堆积条形图

    假设我有一个如下所示的数据框 P Q1 Q2 1 1 4 1 2 2 3 4 3 1 1 4 其中的列告诉我哪个人相应地回答了问题 q1 q2 中的哪一个 这些问题需要按照 4 分李克特量表进行回答 例如 批准 表示 1 稍微批准 表示 2
  • twitterR 和 ROAuth R 软件包安装

    我在安装 CRAN 上的 twitteR 和 RAOuth 软件包时遇到一些问题 我尝试了几种不同的方法 在 Windows 下使用源代码 在 Ubuntu 下使用 RStudio 我尝试了以下命令 sudo apt get install
  • Purrr::map_df() 删除 NULL 行

    使用时purrr map df 我偶尔会传递一个数据框列表 其中一些项目是NULL 当我做 map df 返回行数少于原始列表的数据框 我想发生的事情是这样的map df calls dplyr bind rows 它忽略了NULL价值观
  • 在 R 中使用 lapply 绘制多个数据帧

    我正在尝试使用 lapply 函数绘制多个数据帧 每个数据帧一个图 但是尽管有关此主题的所有帖子我都找不到答案 因为我不断收到错误 图的输出列表为空 我的数据结构如下 df1 lt mtcars gt group by cyl gt tal
  • ActiveRecord:向包含的 ON 子句添加条件

    我有一个模型报价和另一个历史报价 一个报价有很多历史报价 现在 我想立即加载一组报价的某一天的历史报价 如果存在 为此 我认为我需要将这一天传递给 ON 子句 而不是 WHERE 子句 以便我获得所有报价 即使在给定日期没有历史报价时也是如
  • 将数据框中重叠的范围合并到唯一的组中

    我有一个 n 行 3 的数据框 df lt data frame start c 178 400 983 1932 33653 end c 5025 5025 5535 6918 38197 group c 1 1 2 2 3 df sta
  • 文本挖掘 pdf 文件/词频问题

    我正在尝试挖掘一篇具有丰富 pdf 编码和图表的文章的 pdf 我注意到 当我挖掘一些 pdf 文档时 我得到的高频词是 phi taeoe toe sigma gamma 等 它与某些 pdf 文档配合良好 但与其他文档配合使用时却得到这

随机推荐

  • 将旧版本的代码添加到 git repo

    我的项目有一个 git 存储库 我的第一次提交是 v1 2 在使用 git 之前 我使用代码的每日快照来保证其安全 我现在想将所有快照添加到存储库中 并从 v0 3 开始 但我已经在 1 2 之上进行了相当多的提交 那么最好的方法是什么 我
  • 在 Pandas 数据框中查找唯一值,无论行或列位置如何

    我有一个 Pandas 数据框 我想找到该数据框中的所有唯一值 无论行 列如何 如果我有一个 10 x 10 数据框 并假设它们有 84 个唯一值 我需要找到它们 而不是计数 我可以创建一个集合并通过迭代数据帧的行来添加每行的值 但是 我觉
  • 如何检查通过联系表 7 提交的电子邮件是否存在于我的数据库中?

    当客户通过联系表 7 提交电子邮件时 如何检查电子邮件是否已存在于我的数据库中并将通知消息更改为 您的电子邮件已存在于我们的数据库中 到目前为止 我已经尝试使用 before send 挂钩 但是当我单击提交时 页面只是挂起并且没有确认消息
  • 如何告诉捆绑程序忽略不存在的宝石?

    我的组织有许多用于自动化测试的内部 gem 但生产部署不需要它们 我正在尝试使用 Bundler 因此在我的 Gemfile 中我将这些 gem 包装在 group test development do gem dashboard sum
  • 对于临时/循环存储来说,最好/最快的 MySQL 表架构是什么?用于会话管理?

    当为非常动态的网站编写自定义 MySQL 数据库驱动的 PHP 会话管理时 会话表的最佳 最快读 写访问 结构是什么 错误示例 未优化 CREATE TABLE session session id VARCHAR 32 NOT NULL
  • 如何忽略 git 存储库根目录中的目录,但将其进一步包含在树中?

    我需要使用 gitignore排除我的存储库根目录中的目录 但是 其他同名目录存在于目录树的更深处 我需要将它们包括在内 看来当我将目录名称放入 gitignore 它捕获所有这些目录 而不仅仅是我需要忽略的目录 我明白那个 gitigno
  • Visual Studio 2015 中未生成 pdb 文件

    我正在开发一个应用程序 使用C MVC 与实体框架 数据库优先 VS 2015 我创建了一个单独的项目数据层访问 当我在调试或发布模式下构建此项目时 不会生成调试文件 即 pdb file 请告诉我 我怎样才能生成这个 pdb我的项目的文件
  • 更新到 v4.8.0 后 phpMyAdmin 出现错误:$cfg['TempDir'] (./tmp/) 无法访问

    phpMyAdmin在 v4 7 9 上运行良好 今天更新到 v4 8 0 后 替换旧的phpmyadmin文件夹与新文件夹 我在 phpMyAdmin 中收到此消息 cfg TempDir tmp 不可访问 phpMyAdmin 无法 缓
  • ansible if else 构造

    这是我的 if else Ansible 逻辑 name Check certs exist stat path etc letsencrypt live rootDomain fullchain pem register st inclu
  • 带有 Google 卫星图层的 Leaflet Map API [重复]

    这个问题在这里已经有答案了 我对此非常感兴趣传单地图API http leaflet cloudmade com 但是 我需要能够使用 Google 卫星层 我无法找到有关如何将 Google 卫星图层添加到 Leaflet 的示例 我知道
  • Java 中的范围滑块

    大家好 我想知道是否有人听说过提供范围滑块的 Java 组件 滑块 即带有两个旋钮 用于定义最小最大值的范围 而不仅仅是一个 我在网上找到了 perfuse 库中的 JRangeSlider 但我有两个问题 首先 但不是那么重要 是它有自己
  • PHP cURL:如何将正文设置为二进制数据?

    我正在使用一个 API 它希望我发送一个 POST 其中包含文件中的二进制数据作为请求的正文 如何使用 PHP cURL 完成此任务 与我想要实现的目标等效的命令行是 curl request POST data binary myimag
  • 未找到信号器集线器 (403)

    是的 所以我看到了很多与此相关的问题 但建议的修复方案都对我不起作用 我有一个在 Visual Studio 2012 IIS Express 中运行的 MVC4 项目 使用 SignalR 向用户提供一些反馈 当我运行该项目时 我在 Ch
  • 无法通过 SSH 访问 Vagrant VM(不使用 vagrant ssh)

    在准备调整结构部署脚本以与本地 Vagrant VM 配合使用时 我试图说服 VM 让我通过 SSH 连接到它而不使用vagrant ssh 我不断收到错误 我尝试了很多不同的设置组合 但这是最新的 Vagrant 文件 Vagrant c
  • 无法使用故事板将窗口连接到 IBOutlet

    我正在尝试访问 AppDelegate 中的窗口 如果我创建一个没有故事板的新 OSX Cocoa 项目 那么 AppDelegate 包含一个窗口变量 如下所示 class AppDelegate NSObject NSApplicati
  • 在 Spring Boot 中通过 JPA 正确利用纪元秒

    我想将数据库中的所有日期存储为纪元秒 以消除时区歧义 我正在使用JpaRepository http docs spring io spring data jpa docs current api org springframework d
  • Ruby 获取可用磁盘驱动器

    谁能告诉我如何获取 ruby 中可用磁盘驱动器的列表 我正在创建一个开放文件对话 需要知道 预先感谢 嗯 Brian 给出的文章正确地指出了以下代码 require win32ole file system WIN32OLE new Scr
  • 按真实角度旋转位图

    曾几何时 读书这个问题 https stackoverflow com q 7690388 757830 我想知道如何将位图旋转任意角度 而无需自己摆弄所有位 最近 其他人 https stackoverflow com q 1046441
  • 如何从 Spartan 6 写入 Nexys 3 FPGA 板上的 Micron 外部蜂窝 RAM?

    我到处都查过了 数据表 Xilinx 网站 digilent 等等 但什么也没找到 我能够使用 Adept 工具来验证我的蜂窝 RAM 是否正常运行 但我找不到任何库存 VHDL 代码作为控制器来写入数据和从中读取数据 帮助 找到了此链接
  • R - 使用键连接数据帧,然后使用近似日期

    问题 我正在尝试使用 3 个 ID 列 或者 1 列 如果我将 3 个粘贴在一起 合并两个数据帧 其中之一是日期时间变量 并且两个数据帧之间的变化最多为 1 秒 背景 我有两个从带有交易记录的库中提取的数据帧 由于某种原因 签出和签入是分开