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 - 使用键连接数据帧,然后使用近似日期 的相关文章

  • 跟踪循环迭代

    抛硬币 成功 你赢100 否则你输50 你会一直玩 直到你口袋里有钱a 的价值如何a在任何迭代中都被存储 a lt 100 while a gt 0 if rbinom 1 1 0 5 1 a lt a 100 else a lt a 50
  • 从日期变量创建月末日期

    我有一个包含日期变量的大型数据框 它反映了该月的第一天 有没有一种简单的方法来创建代表该月最后一天的新数据框日期变量 以下是一些示例数据 date start month seq as Date 2012 01 01 length 4 by
  • 使用字符串中的变量名称访问变量值,R

    Intro 一个数据集有大量的age year变量 age 1990 age 1991 etc 我有一个字符串值数组length age years 表示这些变量 使得age years 1 回报 age 1990 etc Need 我想搜
  • R中的重叠矩阵

    我有以下数据框 id channel 1 a 1 b 1 c 2 a 2 c 3 a 我想创建并重叠矩阵 它基本上是一个方阵 行和列标签为 a b c 表中的每个条目显示每个通道共有多少个 id 例如 在上面的例子中 矩阵看起来像 a b
  • R 可以创建带有可单击条形图的条形图图像以插入网页吗?

    我知道如何创建条形图 以及如何将其粘贴在网页上 例如 使用hwriteImage in the 作家包 http www embl de gpau hwriter 我想要的是每个栏都是一个在鼠标悬停时突出显示的区域 并且每个栏在单击时都有不
  • R - 计算 bin 中特定值的数量

    我有一个如下所示的数据框 df Value lt c 1 1 0 2 1 3 4 0 0 1 2 0 3 0 4 5 2 3 0 6 Sl lt c 1 20 df lt data frame Sl Value gt df Sl Value
  • Quantmod 的简单功能不再起作用

    我明天要交论文 我收到了一条关于 quantmod 的非常奇怪的错误消息 这是我在过去几周使用这个包时从未遇到过的 我无法导入特定于道琼斯指数 DJI 的数据 我收到以下错误消息 getSymbols DJI src yahoo from
  • 列出 R 数据文件的内容而不加载

    我有时用print load myDataFile RData 当我加载数据文件时列出它的内容 有没有办法列出内容而不加载数据文件中包含的对象 我认为如果不加载对象就无法做到这一点 解决方案可能是使用包装器将 R 对象保存到save 该函数
  • purrr::可能函数可能无法与map2_chr函数一起使用

    我怀疑这是 purrr 包中的错误 但想先在 StackOverflow 中检查我的逻辑 在我看来 possibly功能在内部不起作用map2 chr功能 我正在使用 purrr 版本 0 2 5 考虑这个例子 library dplyr
  • 正态分布平均值的贝叶斯推理玩具 R 代码 [降雪量数据]

    我有一些降雪观测 x lt c 98 044 107 696 146 050 102 870 131 318 170 434 84 836 154 686 162 814 101 854 103 378 16 256 我被告知它遵循正态分布
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • picker输入字体或背景颜色

    我在闪亮的仪表板中使用 pickerInput 这很好 除了一个问题 背景颜色和字体颜色太相似 使得过滤器选择难以阅读 有什么办法可以改变背景或字体颜色吗 如果可能的话 我想继续使用 pickerInput 但如果有一个带有 selectI
  • 如何按用户定义(例如非字母顺序)对数据框进行排序[重复]

    这个问题在这里已经有答案了 给定一个数据框dna gt dna chrom start chr2 39482 chr1 203918 chr1 198282 chrX 7839028 chr17 3874 以下代码重新排序dna by ch
  • `as.matrix` 和 `as.data.frame` S3 方法与 S4 方法

    我注意到定义as matrix or as data frame作为 S4 类的 S3 方法 使例如lm formula objS4 and prcomp object 开箱即用 如果它们被定义为 S4 方法 则这不起作用 为什么将方法定义
  • 更新 R6 对象实例中的方法定义

    如何更新 R6 类实例的方法定义 正如我所期望的 S3 使用当前的方法定义 对于 R5 参考类 我可以使用 myInstance myInstance copy 在 R6 中 我尝试了 myInstance myInstance clone
  • 闪亮的应用程序包:css 和所有 www/ 目录内容

    我正在尝试将 Shiny 应用程序转换为 R 包 但我在处理有关 www 目录以及 松散 文件的所有问题时遇到了问题 我闪亮的应用程序运行得很好 但是当我尝试 打包它 时 它不起作用 我闪亮的应用程序目录 my shiny app R ut
  • 在 Shiny 中显示反应式 htmlTable 表格

    我正在制作我的第一个 Shiny 应用程序 但找不到任何有关如何显示使用 htmlTable 包创建的表格的示例 我基本上想在按下按钮时创建一个表格并显示它 Shiny 显示 html 代码而不是表格 我不知道用什么替换服务器部分中的 re
  • 在 R 中提取 data.frames 列表的名称以及 data.frame 中的值

    在下面的代码中 j是 data frames 的命名列表 我想知道是否有办法 a 提取变量的数值 即one short and one long 在 data frames 内并附加它们的相关名称 即 AAA or BBB or CCC 到
  • 在ggplot中设置y轴中断

    我在代码中设置中断时遇到困难 我尝试添加breaks seq 0 100 by 20 但似乎无法让它正常工作 本质上我希望 Y 轴从 0 到 100 每 20 个刻度一次 YearlyCI lt read table header T te
  • ggplot:如何限制条形图中的输出,以便仅显示最频繁出现的情况?

    我几个小时以来一直在寻找这个简单的东西 但没有结果 我有一个数据框 其中一列为变量 国家 地区 我想要两件事以下 绘制最常见的国家 地区 最常见的位于顶部 找到部分解决方案EDIT找到完整的解决方案 gt gt 重点问题是根据频率限制条形图

随机推荐

  • 将旧版本的代码添加到 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 秒 背景 我有两个从带有交易记录的库中提取的数据帧 由于某种原因 签出和签入是分开