是否可以使用 data.table 索引连接分配习惯进行左连接并将 i 的不匹配行中的 NA 分配给 x ?

2024-02-02

昨天我给出了这样的答案:按五列匹配数据表以更改另一列中的值 https://stackoverflow.com/questions/39176643/matching-data-tables-by-five-columns-to-change-a-value-in-another-column/39176820#39176820.

在评论中,OP 询问我们是否可以有效地实现两个表的左连接,从而获得 NA,从而将右表分配给左表。在我看来,data.table 没有提供任何执行此操作的方法。

这是我在该问题中使用的示例案例:

set.seed(1L);
dt1 <- data.table(id=1:12,expand.grid(V1=1:3,V2=1:4),blah1=rnorm(12L));
dt2 <- data.table(id=13:18,expand.grid(V1=1:2,V2=1:3),blah2=rnorm(6L));
dt1;
##     id V1 V2      blah1
##  1:  1  1  1 -0.6264538
##  2:  2  2  1  0.1836433
##  3:  3  3  1 -0.8356286
##  4:  4  1  2  1.5952808
##  5:  5  2  2  0.3295078
##  6:  6  3  2 -0.8204684
##  7:  7  1  3  0.4874291
##  8:  8  2  3  0.7383247
##  9:  9  3  3  0.5757814
## 10: 10  1  4 -0.3053884
## 11: 11  2  4  1.5117812
## 12: 12  3  4  0.3898432
dt2;
##    id V1 V2       blah2
## 1: 13  1  1 -0.62124058
## 2: 14  2  1 -2.21469989
## 3: 15  1  2  1.12493092
## 4: 16  2  2 -0.04493361
## 5: 17  1  3 -0.01619026
## 6: 18  2  3  0.94383621
key <- paste0('V',1:2);

这是我给出的解决方案not获取不匹配行的 NA:

dt1[dt2,on=key,id:=i.id];
dt1;
##     id V1 V2      blah1
##  1: 13  1  1 -0.6264538
##  2: 14  2  1  0.1836433
##  3:  3  3  1 -0.8356286
##  4: 15  1  2  1.5952808
##  5: 16  2  2  0.3295078
##  6:  6  3  2 -0.8204684
##  7: 17  1  3  0.4874291
##  8: 18  2  3  0.7383247
##  9:  9  3  3  0.5757814
## 10: 10  1  4 -0.3053884
## 11: 11  2  4  1.5117812
## 12: 12  3  4  0.3898432

我们需要的是为了id值 12 及以下仍保留在dt1替换为 NA (not因为他们的年龄为 12 岁及以下,并且not因为这些 id 值缺失了dt2,但是因为加入key列,即V1 and V2,不会导致这些行的匹配dt1反对dt2).

正如我在该问题的评论中所说,解决方法是预先分配dt1$id到所有 NA,然后运行索引连接分配。因此,这是预期的输出:

dt1$id <- NA;
dt1[dt2,on=key,id:=i.id];
dt1;
##     id V1 V2      blah1
##  1: 13  1  1 -0.6264538
##  2: 14  2  1  0.1836433
##  3: NA  3  1 -0.8356286
##  4: 15  1  2  1.5952808
##  5: 16  2  2  0.3295078
##  6: NA  3  2 -0.8204684
##  7: 17  1  3  0.4874291
##  8: 18  2  3  0.7383247
##  9: NA  3  3  0.5757814
## 10: NA  1  4 -0.3053884
## 11: NA  2  4  1.5117812
## 12: NA  3  4  0.3898432

我认为解决方法是好的,但我不确定为什么 data.table 似乎无法通过索引连接分配操作一次性实现此功能。以下是我探索的三个死胡同:

1: nomatch

data.table 提供了nomatch论点看起来有点像all, all.x, and all.y的论据merge()。这实际上是一个非常有限的论点;它只允许从右连接更改(nomatch=NA,默认值)到内连接(nomatch=0)。我们无法用它实现左连接。

2: flip dt1 and dt2

Since dt1[dt2]是右连接,我们可以翻转它,意思是dt2[dt1],实现相应的左连接。

这也不起作用,因为我们需要使用:=中的就地赋值语法j要分配给的参数dt1,在翻转调用下,我们将分配给dt2。我尝试分配给i.id在翻转命令下,但不影响原来的dt1.

3: use merge.data.table()

我们可以打电话merge.data.table()all.x=T实现左连接的参数。现在的问题是merge.data.table() has no j参数,并且它根本不提供就地分配左(或右)表的列的方法。


那么,是否可以使用 data.table 来执行此操作?如果是这样,最好的方法是什么?


AFAIU 你只是想查找id专栏来自dt2 to dt1。原来的id变量在dt1当你加入时似乎与整个过程无关V1,V2你不想拥有dt1$id结果中的值。因此,从技术上讲,解决这个问题的正确方法是根本不使用该列。

set.seed(1)
library(data.table)
dt1 <- data.table(id=1:12,expand.grid(V1=1:3,V2=1:4),blah1=rnorm(12L));
dt2 <- data.table(id=13:18,expand.grid(V1=1:2,V2=1:3),blah2=rnorm(6L));
on = paste0("V",1:2) # I rename to `on` to not mask `key` function
dt1[,id:=NULL
    ][dt2,on=on,id:=i.id
      ][]
#  V1 V2      blah1 id
# 1:  1  1 -0.6264538 13
# 2:  2  1  0.1836433 14
# 3:  3  1 -0.8356286 NA
# 4:  1  2  1.5952808 15
# 5:  2  2  0.3295078 16
# 6:  3  2 -0.8204684 NA
# 7:  1  3  0.4874291 17
# 8:  2  3  0.7383247 18
# 9:  3  3  0.5757814 NA
#10:  1  4 -0.3053884 NA
#11:  2  4  1.5117812 NA
#12:  3  4  0.3898432 NA

除了这个问题...
- 你不必使用;如果只有单个表达式要计算,则在行尾
- use dt1[, id := NA_integer_]代替dt1$id <- NA
- use set.seed当提供代码时rnorm以及其他与随机性相关的调用

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

是否可以使用 data.table 索引连接分配习惯进行左连接并将 i 的不匹配行中的 NA 分配给 x ? 的相关文章

  • randomForest 包在删除一个预测类时的奇怪行为

    我正在运行一个随机森林模型 它产生的结果从统计角度来看对我来说完全没有意义 因此我确信有些东西mustrandomForest 包的代码出现错误 至少在模型的本次迭代中 预测 左侧变量是具有 3 种可能结果的政党 ID 民主党 独立党 共和
  • 如何在 R 中合并同名列表中的数据框?

    我有一个包含很多数据框的列表 如果它们具有相同的名称 我想合并它们 即合并所有具有相同名称 a 和 b 的数据框 像这样 a lt aaaaa b lt bbbbb c lt ccccc g lt list df1 lt data fram
  • 如何对数字进行四舍五入并使其显示零?

    R 中将数字四舍五入到小数点后 2 位的常用代码是 gt a 14 1234 gt round a digits 2 gt a gt 14 12 但是 如果该数字的前两位小数位为零 则 R 会在显示中抑制零 gt a 14 0034 gt
  • 将字符串列拆分为多个虚拟变量

    作为 R 中 data table 包的相对缺乏经验的用户 我一直在尝试将一个文本列处理为大量指示符列 虚拟变量 每列中的 1 表示特定的子字符串是在字符串列中找到 例如我想处理这个 ID String 1 a b 2 b c 3 c 进入
  • purrr::可能函数可能无法与map2_chr函数一起使用

    我怀疑这是 purrr 包中的错误 但想先在 StackOverflow 中检查我的逻辑 在我看来 possibly功能在内部不起作用map2 chr功能 我正在使用 purrr 版本 0 2 5 考虑这个例子 library dplyr
  • 如何在 data.table 中分组后使用条件计算行数

    我有以下数据框 dat lt read csv s1 s2 v1 v2 a b 10 20 a b 22 NA a b 13 33 c d 3 NA c d 4 5 NA c d 10 20 dat gt A tibble 6 x 4 gt
  • picker输入字体或背景颜色

    我在闪亮的仪表板中使用 pickerInput 这很好 除了一个问题 背景颜色和字体颜色太相似 使得过滤器选择难以阅读 有什么办法可以改变背景或字体颜色吗 如果可能的话 我想继续使用 pickerInput 但如果有一个带有 selectI
  • 将列表中的每个元素转换为数据框中的一列

    假设我有以下列表 d library combinat d permn c a b c 这看起来如下 1 1 a b c 2 1 a c b 3 1 c a b 4 1 c b a 5 1 b c a 6 1 b a c 是否可以将此列表的
  • `dplyr::_join` 函数的命名向量“by”参数[重复]

    这个问题在这里已经有答案了 我正在写一个函数dplyr join两个数据框by不同的列 第一个数据帧的列名称动态指定为函数参数 我相信我需要使用rlang准引用 元编程 但未能找到可行的解决方案 我很感激任何建议 library dplyr
  • 将DataTable批量插入postgreSQL表中

    在 SQL 中 我们执行类似的操作来批量插入数据表 SqlBulkCopy copy new SqlBulkCopy sqlCon copy DestinationTableName strDestinationTable copy Wri
  • R ggplot 中的柯尔莫哥洛夫-斯米尔诺夫图

    我正在尝试在 r 中绘制 KS 图 一切似乎都很顺利 除了我只能使用颜色来可视化两个不同的样本而不是线型这一事实 我已经尝试过以下方法 sample1 lt SD13009 sample2 lt SD13009PB group lt c r
  • 在 Shiny 中显示反应式 htmlTable 表格

    我正在制作我的第一个 Shiny 应用程序 但找不到任何有关如何显示使用 htmlTable 包创建的表格的示例 我基本上想在按下按钮时创建一个表格并显示它 Shiny 显示 html 代码而不是表格 我不知道用什么替换服务器部分中的 re
  • R,使用具有两种以上可能性的二项式分布

    我知道这可能是基本的 但我似乎有一个心理障碍 假设您想要计算在一个骰子上掷出 4 5 或 6 的概率 在 R 中 这很简单 sum 1 6 1 6 1 6 这给出了 1 2 这是正确答案 然而 我内心深处 可能应该保留的地方 认为我应该能够
  • R Shinydashboard 自定义 CSS 到 valueBox

    我一直在尝试将 valueBox 的颜色更改为自定义颜色 超出 validColors 中可用的颜色 但一直无法这样做 我知道有一种方法可以使用标签来包含自定义 CSS 但是我无法将它们放在正确的位置 ui lt dashboardPage
  • R在Windows平台Rstudio上打印data.frames中的UTF-8代码

    当数据框中存在UTF 8字符时 将无法正常显示 例如 以下内容是正确的 gt U6731 1 朱 但是当我将其放入数据框中并打印出来时 它是 gt data frame x U6731 x 1
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 当设置 coord_fixed 时,ggplot/shiny 中的鼠标悬停坐标是错误的

    我正在使用问题中的答案 当您将鼠标悬停在闪亮的 ggplot 上时出现工具提示 https stackoverflow com questions 27965931 tooltip when you mouseover a ggplot o
  • 如何根据 ggplot2 中的汇总数据创建堆积条形图

    我正在尝试使用 ggplot 2 创建堆积条形图 我的宽格式数据如下所示 每个单元格中的数字是响应的频率 activity yes no dontknow Social events 27 3 3 Academic skills works
  • 如何为自定义 S3 类实现提取/取子集 ([ [<-, [[ [[<-)] 函数?

    我有一个自定义的 S3 类foo 它在正常的基础上添加了一些自定义行为data frame foo object lt data frame class foo object lt c foo data frame 对于这个类 还应该有一个
  • case_when 与部分字符串匹配和 contains()

    我正在使用一个数据集 其中有许多名为 status1 status2 等的列 在这些列中 它表示某人是否豁免 完整 注册等 不幸的是 豁免投入并不一致 这是一个示例 library dplyr problem lt tibble perso

随机推荐

  • cmd编程中的速度和时间问题

    最近存在一个问题 即如何将具有用户预定义文件类型扩展名的许多文件从一个文件夹移动到许多不同的文件夹 这些文件夹是根据文件名中的密钥字符串 年份 立即创建的 此外 当移动到新创建的文件夹时 文件应在没有用户预定义文件类型扩展名的情况下保存 文
  • 指针变量只是带有一些运算符的整数还是“符号”?

    编辑 最初的单词选择令人困惑 象征性 这个词比原来的 神秘的 要好得多 在关于我之前的 C 问题的讨论中 我被告知指针是 类似于整数的简单值类型 https stackoverflow com questions 32043314 over
  • python asyncio aiohttp 超时

    注意事项 这是我第一次使用 asyncio 所以我可能做了一些非常愚蠢的事情 场景如下 我需要 http ping 一个巨大的 url 列表来检查它们是否响应 200 或任何其他值 尽管像 gobuster report 200 403 等
  • 如何使用重构从类中删除泛型类型

    我有这门课 public class TimeIntCo
  • 搜索多个字符串

    我知道在文件 kmp 中查找一个字符串或在文件 trie 中查找各种字符串的有效方法 但是 多年来 我一直想知道是否有一种方法 有时认为不可能 在多个文件中搜索多个字符串 假设我有一百万个文件 我想回答诸如 查找包含字符串 香蕉 摩托艇 和
  • Pyspark结构化流Kafka配置错误

    我之前已经成功地将 pyspark 用于 Spark Streaming Spark 2 0 2 和 Kafka 0 10 1 0 但我的目的更适合结构化流 我尝试使用在线示例 https spark apache org docs 2 1
  • 微服务横向扩展数据库的最佳实践或设计

    微服务的主要好处是可以通过使用多个容器实例和负载平衡来扩展一种服务 类型 以提高吞吐量 但有一件事是 服务类型 的多个实例 即容器 共享同一个数据库实例 当多个实例在该数据库实例上写入 读取时 这可能会造成性能瓶颈 传统上 我们会扩展该数据
  • 使用 css 显示/隐藏 html 表格列

    我想显示一个基本的 html 表 其中包含用于切换显示 隐藏附加列的控件 table tr th Column 1 th th class col1 1a th th class col1 1b th th Column 2 th th c
  • Yii:HAS_MANY 搜索

    我有以下表格 user id cv personal data id cv personal data id firstname surname gender address cv laboral exp id user id positi
  • 启动时出现空白页

    在获得启动画面之前 当我启动应用程序时 我会看到一段时间的空白页 Activity但我还是明白了 怎么了 清单文件
  • Express JS 4.0 命令行工具不起作用

    我使用express 3 x有一段时间了 命令行工具运行得非常好 我决定更新到 4 0 以便我可以尝试一下并使旧应用程序兼容 4 x sudo npm install g express 安装快递完全没问题 但是当我尝试时 exprsss
  • Python多处理调用对象方法[重复]

    这个问题在这里已经有答案了 我想使用Python的多处理模块来启动一个新进程 该进程创建一些其他对象并调用该对象的loops forever方法 在我的主课中 我有 import OtherService from multiprocess
  • GWT 中的 JOptionPane.showInputDialog()

    是否有任何简单的方法来创建具有单个文本输入控件的模态对话框实例 该实例将在按 确定 时返回输入到文本控件中的字符串 我正在寻找类似于 Swing 中的 JOptionPane showInputDialog 一行的东西 您可以创建自己的类
  • 是否存在无法使用尾递归编写的问题?

    尾递归是函数式语言中重要的性能优化策略 因为它允许递归调用消耗常量堆栈 而不是 O n 是否存在根本无法用尾递归风格编写的问题 或者是否总是可以将朴素递归函数转换为尾递归函数 如果是这样 有一天函数式编译器和解释器是否会足够智能来自动执行转
  • Javascript 事件:window.event 与参数引用(函数)

    有什么区别 function test e console log Event e document querySelector button onclick test
  • 在 ASP.Net WebAPI 中,RouteParameter.Optional 是否表示 URL 的可选部分?

    我有以下路由规则 config Routes MapHttpRoute name DefaultApi routeTemplate api controller id defaults new id RouteParameter Optio
  • 为什么 Silverlight 4 Tools 只提供部分智能感知?

    我终于安装了 Silverlight 4 Toolkit 并在之后进行了引用和工作很难找到这个问题中描述的正确的命名空间 https stackoverflow com questions 2661010 how can i get sil
  • 使用nodejs创建考勤登记表

    问题 从 txt 文件中逐行读取学生姓名 对于每个名字 询问该学生是否在上课 例如 迈克尔在上课吗 是 否 让用户输入是或否 将每个名称和条目存储在另一个 txt 文件中 解决方案 我编写了这段几乎可以工作的代码 只是在循环 readlin
  • Ajax 调用 .Net 并发送回 cookie

    我正在从 html 页面 移动 向 net 服务器进行 ajax 调用以进行登录和身份验证 现在我正在发送一个 JSON 响应 结果为 success true 这一切都工作正常 但我需要设置 cookie 以便在登录后进行其他调用来记录数
  • 是否可以使用 data.table 索引连接分配习惯进行左连接并将 i 的不匹配行中的 NA 分配给 x ?

    昨天我给出了这样的答案 按五列匹配数据表以更改另一列中的值 https stackoverflow com questions 39176643 matching data tables by five columns to change