data.table 非等值连接中的意外行为

2023-12-08

这是后续this问题,其中接受的答案显示了使用匹配练习的示例data.table,包括非平等条件。

背景

基本设置是我们有DT1包含人员详细信息样本,以及DT2,这是一种主数据库。目的是找出每个人是否DT1匹配至少一项DT2.

首先,我们初始化一个表示匹配的列FALSE,以便其值可以更新为TRUE每当找到匹配项时。

DT1[, MATCHED := FALSE]

然后使用以下通用解决方案来更新列:

DT1[, MATCHED := DT2[.SD, on=.(Criteria), .N, by=.EACHI ]$N > 0L ]

从理论上讲,它看起来(并且应该工作)很好。子表达式DT2[.SD, on=.(Criteria), .N, by=.EACHI]生成一个子表,其中每一行来自DT1,并计算N列是在中找到的该行的匹配数DT2。然后,每当N大于零,则值MATCHED in DT1更新为TRUE.

它按预期工作在一个微不足道的可重现的例子。但我在使用真实数据时遇到了一些意想不到的行为,并且无法深究其根源。我可能遗漏了一些东西或者它可能是一个错误。不幸的是,我无法提供最小的可重现示例,因为数据很大,并且仅在大数据中显示。但我会尽力记录下来。

意外行为或错误

注意到这一点的是,由于历史原因,需要在两个单独的数据库中寻找匹配,因此,过滤器!(MATCHED)添加到表达式中以仅更新那些尚未匹配的值:

DT1[!(MATCHED), MATCHED := DT2[.SD, on=.(Criteria), .N, by=.EACHI ]$N > 0L ]

然后我注意到,如果该行重新运行几次,则每次后续运行都会有越来越多的匹配项,这些匹配项在之前的运行中未匹配。 (与单独的数据库无关,每次运行都与 DT2 匹配)。

第一次运行:

   MATCHED       N
1:   FALSE 3248007
2:    TRUE 2379514

第二次运行:

   MATCHED       N
1:   FALSE 2149648
2:    TRUE 3477873

为了进行调查,我过滤了第一次运行时不匹配但第二次运行时匹配的案例。看起来大多数情况都是漏报,即那些应该在第一次运行时匹配但没有匹配的情况。 (但经过多次运行,最终也会出现许多误报)。

例如,这是来自DT1:

         DATE FORENAME SURNAME
1: 2016-01-01     JOHN   SMITH

以及来自 DT2 的匹配条目:

   START_DATE EXPIRY_DATE FORENAME SURNAME
1: 2015-09-09  2017-05-01     JOHN   SMITH

在主表达式之外单独运行子表达式(如上所述),以查看N数字,我们看到它没有导致匹配,而它应该(N=0)。 (您可能还注意到START_DATE and END_DATE承担的价值DATE在输出中,但这是一个完全不同的问题)。

SUB <- DF2[DF1, on=.(FORENAME, SURNAME, START_DATE <= DATE, EXPIRY_DATE >= DATE), .N, by=.EACHI]
SUB[FORENAME=="JOHN" & "SURNAME=="SMITH"]

   FORENAME SURNAME START_DATE EXPIRY_DATE N
1:     JOHN   SMITH 2016-01-01  2016-01-01 0

然而,错误的行为是结果受到中存在的其他行的影响DF1。例如,假设我知道JOHN SMITH的行号在DF1是 149 并过滤DF1仅该行:

DF2[DF1[149], on=.(FORENAME, SURNAME, START_DATE <= DATE, EXPIRY_DATE >= DATE), .N, by=.EACHI]

   FORENAME SURNAME START_DATE EXPIRY_DATE N
1:     JOHN   SMITH 2016-01-01  2016-01-01 1

其次,我还注意到,错误行为仅在条件中存在多个非平等标准时才会发生。如果条件是on=.(FORENAME, SURNAME, START_DATE <= DATE),运行之间不再有任何差异,并且所有行第一次似乎都正确匹配。

不幸的是,为了解决现实世界的问题,我must存在多个非对等匹配条件。不仅要确保DT1's DATE在。。。之间DT2's START_DATE and END_DATEs,而且还有DT1's CHECKING_DATE是在之前DT2's EFFECTIVE_DATE, etc.

总结一下

非股权加盟data.table在以下情况下,行为方式会出现错误:

  1. 其中一张表中存在/不存在某些行

AND

  1. 多个非对等条件

更新:可重现的示例

set.seed(123)
library(data.table)
library(stringi)

n <- 100000

DT1 <- data.table(RANDOM_STRING = stri_rand_strings(n, 5, pattern = "[a-k]"),
                  DATE = sample(seq(as.Date('2016-01-01'), as.Date('2016-12-31'), by="day"), n, replace=T))

DT2 <- data.table(RANDOM_STRING = stri_rand_strings(n, 5, pattern = "[a-k]"),
                  START_DATE = sample(seq(as.Date('2015-01-01'), as.Date('2017-12-31'), by="day"), n, replace=T))

DT2[, EXPIRY_DATE := START_DATE + floor(runif(1000, 200,300))]

#Initialization
DT1[, MATCHED := FALSE]

#First run
DT1[!(MATCHED), MATCHED := DT2[.SD, on=.(RANDOM_STRING, START_DATE <= DATE, EXPIRY_DATE >= DATE), .N, by=.EACHI ]$N > 0L ]
DT1[, .N, by=MATCHED]

   MATCHED     N
1:   FALSE 85833
2:    TRUE 14167

#Second run
DT1[!(MATCHED), MATCHED := DT2[.SD, on=.(RANDOM_STRING, START_DATE <= DATE, EXPIRY_DATE >= DATE), .N, by=.EACHI ]$N > 0L ]
DT1[, .N, by=MATCHED]

   MATCHED     N
1:   FALSE 73733
2:    TRUE 26267

#And so on with subsequent runs...

这是一个解决方案,一点也不优雅,但在错误未修复的情况下似乎给出了正确的结果。

首先,我们需要每一行DT1 and DT2拥有一个唯一的ID。行号就可以了。

DT1[, DT1_ID := 1:nrow(DT1)]
DT2[, DT2_ID := 1:nrow(DT2)]

然后,我们执行以下右连接来查找匹配项:

M <- DT2[DT1, on=.(RANDOM_STRING, START_DATE <= DATE, EXPIRY_DATE >= DATE)]

head(M, 3)

   RANDOM_STRING START_DATE EXPIRY_DATE DT2_ID DT1_ID
1:         diejk 2016-03-30  2016-03-30     NA      1
2:         afjgf 2016-09-14  2016-09-14     NA      2
3:         kehgb 2016-12-11  2016-12-11     NA      3

M每行都来自DT1在该行的所有匹配项旁边DT2. When DT2_ID = NA,没有匹配。nrow(M) = 100969,表明一些DT1行匹配到 >1DT2排。 (日期也采用了错误的值。)

接下来,我们可以使用一个ifelse()语句来标记原始行DT1根据它们是否匹配。

DT1$MATCHED <- ifelse(DT1$DT1_ID %in% M[!is.na(DT2_ID)]$DT1_ID, TRUE, FALSE)

最终结果:100,000 场比赛中的 13,316 场比赛

DT1[, .N, by=MATCHED]

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

data.table 非等值连接中的意外行为 的相关文章

  • 单击并按住 R 中的按钮闪亮?

    我希望能够通过单击 R 闪亮按钮来更改参数的值 所以我需要按钮 一个用于增加值 一个用于减少值 我想在按住按钮的同时保持值以一定的速度减少 增加 通过释放按钮的点击 动作应该停止 到目前为止我还没有找到这个选项actionButtons在
  • 从 R 主题模型中的 DocumentTermMatrix 中删除空文档?

    我正在使用 R 中的 topicmodels 包进行主题建模 我正在创建一个 Corpus 对象 进行一些基本的预处理 然后创建一个 DocumentTermMatrix corpus lt Corpus VectorSource vec
  • R - 根据另一个数据框查找每组的重叠日期

    我有一个数据框 其中包含多个雨量计的降雨测量值 如下例所示 gt rnfl ID date value 1 250 2000 03 01 5 37 2 250 2000 03 02 0 00 3 250 2000 03 03 2 94 4
  • glm() 模型的交叉验证

    我正在尝试对我之前在 R 中构建的一些 glm 模型进行 10 倍交叉验证 我对cv glm 函数在boot包 尽管我已经阅读了很多帮助文件 当我提供以下公式时 library boot cv glm data glmfit K 10 这里
  • udunits2 R 安装:找不到 udunits2.h

    我正在尝试在 R 中安装 udunits2 以满足对ggforce包裹 但是 安装程序在检查 udunits2 时始终失败 我已经尝试过中的说明this https stackoverflow com questions 47059517
  • r Shiny 中的 fileInput 函数没有响应

    我是 R 和 R闪亮的新手 一直致力于构建一个统计应用程序 该应用程序将允许用户导入文件 然后对数据运行不同的统计程序 直到最近 fileData 函数一直对我来说运行良好 现在每当我尝试上传文件时 都不会打开任何内容 我已尝试了所有我能想
  • mclapply 用户时间大于已用时间

    我正在尝试使用mclapply的功能parallel封装在R 该函数通过计算对数似然距离将值分配给序列矩阵 这是一个 CPU 密集型操作 所结果的system time价值观令人困惑 gt system time mclapply work
  • 如何在 R 地图库中绘制正确的颜色

    我正在尝试使用 R 地图库为特定国家绘制特定颜色 我可以填写颜色 但它们与各自的国家 地区没有正确关联 我想知道是否有人能知道为什么 我的数据框是 filld 有 3 列 第一列是国家名称 第二列只是一些数字数据 第三列是颜色 countr
  • 使用 SparkR 1.5 从 RStudio 中的 hdfs 读取大文件(纯文本、xml、json、csv)的选项

    我是 Spark 新手 想知道除了下面的选项之外是否还有其他选项可以使用 SparkR 从 RStudio 读取存储在 hdfs 中的数据 或者我是否正确使用它们 数据可以是任何类型 纯文本 csv json xml 或任何包含关系表的数据
  • 如何在 Shiny 中动态渲染的 textInput 添加样式元素

    你好堆栈溢出 在我最近提出的问题中 我已经解决了一些与动态渲染 UI 元素相关的主要问题 并在一些了不起的人的帮助下动态创建了观察者 参见此处 动态渲染的 UI 如何在第二次运行时删除旧的反应变量 https stackoverflow c
  • VIEW for 表结合 UNION ALL 的 MySQL 性能

    假设我有 2 张桌子MySQL create table persons id bigint unsigned not null auto increment first name varchar 64 surname varchar 64
  • R 中带有边缘箱线图的直方图

    如何使直方图中的 X 轴与边缘箱线图匹配 data lt rnorm 1000 nf lt layout mat matrix c 1 2 2 1 byrow TRUE height c 1 3 layout show nf par mar
  • 分割单个 SpatialPolygons 对象的多边形部分

    在 R 中 我有一个SpatialPolygons包含数百个多边形的对象 即多个多边形 我想分割这个SpatialPolygons对象放入列表中Polygons 即孔应保持连接到父多边形 知道如何做到这一点吗 EDITED 使用以下提供的示
  • 了解涉及 3 个或更多表时 JOIN 的工作原理。 [SQL]

    我想知道是否有人可以帮助我提高对 SQL 中 JOIN 的理解 如果它对问题很重要 我会特别考虑 MS SQL Server 取 3 个表 A B A 通过某些 A AId 与 B 相关 和 C B 通过某些 B BId 与 C 相关 如果
  • 如何优化 R 中的 sapply 来计算数据帧上的运行总计

    我在 R 中编写了一个函数来按月份计算累积总数 但随着数据集变大 我的方法的执行时间呈指数增长 我是一名 R 程序员新手 你能帮我提高效率吗 该函数以及我调用该函数的方式 accumulate lt function recordnum d
  • 如何在 R 中查找平衡面板数据(又名,如何查找面板中的哪些条目在给定窗口内完整)

    我有来自 Compustat 的大量数据 我向其中添加了一些手工收集的数据 认真地从一堆旧书中手工收集 但我不想手工收集整个面板 只想随机选择一个子集 为了找到更大的集合 我从中随机选择 我想从 Compustat 的平衡面板开始 我看到p
  • for 循环与 cor.test 在许多类别上

    我正在尝试在 R 中编写一个循环 它将循环遍历 3 个不同的物种 以计算两个连续变量 Redness 和 VarNormAbund 之间的相关性 我的循环正在运行 但 3 个物种中每一个的输出都是相同的 这让我认为循环卡在第一个物种上 co
  • R:如何更改ggvis闪亮应用程序中特定范围的绘图背景颜色

    I have a simple shiny app like below and you can run it The plots are created by ggvis and user can choose student name
  • 如何处理包内部的 R 数据?

    我正在开发的 R 包需要多个 R 数据对象 例如预先计算的模型和参数 目前 我将包的 数据 目录中的每个对象放在单独的 RData 文件中 使用该包时 用户可以使用 数据 功能将这些对象附加到他们的环境中 我想要的行为是 在加载包时 数据对
  • R Shiny - 使用 DataTable 移动列名称

    我有一个非常复杂的闪亮代码 其中有几个面板和这些面板内的几个表格 启动应用程序时 列名称与列值正确对齐 但是 一旦我更改应用程序表格下的页码 列名称就会移动到左侧 而值仍保留在中间 如何强制应用程序使列名称与列值对齐 一个可重现的例子 li

随机推荐

  • 如何将树形视图转换为 xml?

    我目前正在开发一个项目 我需要将树视图转换为 xml 以便我可以将该 xml 数据发送到另一个端口 private void button1 Click object sender EventArgs e var rootElement n
  • 使用 Microsoft Graph 更改 Azure AD 的密码

    我原本计划使用 Azure AD Graph API 但后来在 Microsoft 文档中注意到有关使用 Microsoft Graph API 的建议 是否提供了更改用户密码的文档 string result Task Run async
  • 在 PHP 中执行字符串连接的最佳方法是什么?

    在 php 中 我们可以通过多种方式附加字符串 Method 1 sql SELECT field1 sql field2 sql field3 sql field4 sql FROM table1 sql WHERE condition1
  • 确保至少选中一个复选框

    我有一个带有多个复选框的表单 我想使用 JavaScript 来确保至少选中一个 这就是我现在所拥有的 但无论选择什么 都会弹出警报 JS 错误 function valthis if document FC c1 checked aler
  • 从日历中删除选定的事件

    我正在使用 JQuery Full Calendar 和 Spring MVC 你好 我做了一个演示 比如that 目标 我需要当用户单击她 他已经插入的事件时 出现一个对话框 并让他 她能够删除该事件或取消 问题 现在 每当用户单击任何一
  • 谷歌静态地图使用的两个相互矛盾的陈述

    我发现关于 google stati 地图 api 的限制使用的两个相互矛盾的陈述 根据这个链接 每天允许使用 25 000 次 根据这个链接每天允许使用 1000 次 现在我很困惑哪个是正确的 25000 是每个站点的限制 1000 是每
  • jQuery - 将方法应用于多个对象

    我想对许多声明的变量运行相同的方法 例如 说我有 var searchBtn search var signInBtn signin signInBtn removeClass active searchBtn removeClass ac
  • 将经过训练的超正方文件合并为一个

    我在 Mac 上使用最新版本的 Tesseract 我在一个文件夹中有一个 eng traineddata 在另一个文件夹中有一个 eng traineddata 我希望将我的训练数据文件合并到一个大的训练字体文件中 谁能告诉我该怎么做 我
  • C# 中的骨架化 OpenCV

    任何人都可以给我一个例子 说明如何在不使用距离变换的情况下进行骨架化 或者如果您有使用距离跑步变换的骨架化 我有一个用 C 编写的 OpenCV 示例 更多不起作用 cvlib CvDistTransform pimg ref ref ti
  • 在 ListModel 中传递数组

    我想知道如何在 ListModel 中传递数组 好的 在 QML 中我有一个 ListView 我将其设置为ListModel像这样 model ListModel id myList ListElement name card 0 boo
  • pd.get_dummies() 在大级别上缓慢

    我不确定这是否已经是最快的方法 或者我是否这样做效率低下 我想对一个具有 27k 可能级别的特定分类列进行热编码 该列在 2 个不同的数据集中具有不同的值 因此我在使用 get dummies 之前首先组合了级别 def hot encod
  • 使用 ruby​​ 和 sinatra 保存循环构建的 html 文本中的所有用户条目

    我正在创建一个显示表格的网页 每条记录的末尾还有四列 它们是用户可以输入数据的文本字段 当用户点击底部的提交按钮时 我想保存所有文本字段中的所有数据并将其添加到我的表中 如何保存所有文本字段的数据 这是我的代码 h1 Testing Tab
  • 通过 Java 使用 REST API

    我有一个位于远程服务器上的管理 Web 应用程序 这个应用程序是使用 MEAN 堆栈编写的 我有一个连接到 Web 应用程序所需的所有 RESTful 路由的列表 我正在编写一个 Java 客户端应用程序 需要从此管理应用程序发送和接收数据
  • 如何覆盖 UISearchBar 中的取消按钮

    我目前正在使用以下方法来阻止取消按钮项目显示在搜索栏中 我有一个习惯UIButton我想用它来代替 问题是目前内置的取消按钮仍然显示 void searchDisplayControllerDidBeginSearch UISearchDi
  • 如何检查闹钟是否已设置并正在运行

    我有一个接收器 在手机启动后启动 如下所示
  • HttpConnection - javax.microedition,为 getLength() 方法返回 -1

    我正在尝试用 java 编写一个非常简单的移动应用程序 J2ME 这个想法是通过 URL 输入访问网站并将网站内容读入缓冲区 问题就在这里 这对某些 URL 来说效果很好 但对其他 URL 却不起作用 下面的例子 维基百科 工作正常 但是以
  • Java生成在2^48周期内不重复的“随机”数字

    基本上我想生成在很长一段时间内不会重复的随机数 我不想使用序列 例如java使用的LCG synchronized protected int next int bits seed seed 0x5DEECE66DL 0xBL 1L lt
  • 去掉中间的背景,只保留边框

    这可以做到吗 如何让背景中间完全透明 这将使中间部分透明 并且不会对其应用任何内容 https jsfiddle net racsob9v 现在看起来是这样的 我正在尝试这样做 html body height 100 padding 0
  • 当我的 ViewController 嵌入到 UINavigationController 中时,如何对值进行排序?

    我有两个视图控制器 它们通过 segues 来回发送值准备继续方法 这对我来说一直很完美 直到我决定将我的 ViewController 嵌入到导航控制器中 如果您查看下面的方法 您会发现问题是我的目的地视图控制器不再是 ViewContr
  • data.table 非等值连接中的意外行为

    这是后续this问题 其中接受的答案显示了使用匹配练习的示例data table 包括非平等条件 背景 基本设置是我们有DT1包含人员详细信息样本 以及DT2 这是一种主数据库 目的是找出每个人是否DT1匹配至少一项DT2 首先 我们初始化