【问题标题】:Joining tables based on different column names根据不同的列名连接表
【发布时间】:2014-12-23 01:22:17
【问题描述】:

我正在观看 Greg Reda 制作的关于 Pandas 的视频[1],以了解 Pandas 与 data.table 相比可以做什么。我很惊讶地发现在 data.table 中连接表是多么困难。如果您观看视频,特别是 @49:00 到 @52:00 分钟,您会看到 Pandas 允许您根据不同的列名连接表,并且您可以为左右表选择不同的后缀。我了解 setkey 用于优化目的 [2] 并了解如何使用相同的列名 [3] 连接表。我尝试了 data.table 的合并,但在使用不同的列名设置 by= 关键字参数时遇到了很多困难。所以这是我的问题。

是否可以在 data.table 中根据不同的列名连接表?如果是这样,怎么做?如果不是,为什么不呢?另外,更有用的是,这个功能不会有用吗?我发现这个问题没有更早出现令人惊讶。如果之前已经讨论过,请原谅我(请指点我)。

顺便说一句,Greg 所说的数据是在他的 github[4] 上找到的。

  1. https://www.youtube.com/watch?v=1uVWjdAbgBg
  2. https://stackoverflow.com/a/13686768/3892933
  3. Joining tables with identical (non-keyed) column names in R data.table
  4. https://github.com/gjreda/pydata2014nyc

【问题讨论】:

  • Vijay,这两个功能都在 1.9.5 中实现。如果您有其他改进建议,请在 github 页面上告诉我们。谢谢。
  • 谢谢,阿伦。现在,data.table 的行为更像常规的 data.frame。现在我可以更频繁地使用 data.table!

标签: r data.table


【解决方案1】:

更新:下面列出的所有功能都已实现,并且在 CRAN 上的 data.table v1.9.6 的当前稳定版本中可用。


data.tables 中的连接至少有这些改进。

  • merge.data.table 获得by.xby.y 参数

  • 使用 辅助键 使用上述两种形式加入,无需设置键,而是通过在 xi 上指定列。

最简单的原因是我们还没有成功。

【讨论】:

  • 谢谢@Arun。我喜欢by.xby.y 参数。我一点也不抱怨。我真的很喜欢 data.table 并希望它成功。我正在学习 data.table 的内部/代码,我会尽快做出贡献。
  • @Vijay,不用担心。没想到你是。很高兴你正在学习内部结构。如果您有问题/困难,可以给我(和/或马特)发电子邮件(请参阅 github 项目页面)。祝你好运:-)。
【解决方案2】:

通常,在加入 data.tables 时,列名实际上并不重要。你只需要确保两个表都有一个兼容的键。

library(data.table)
dt1<-data.table(a=letters[1:10], b=1:10)
setkey(dt1,a)
dt2<-data.table(x=letters[1:10], y=10:1)
setkey(dt2,x)

dt1[dt2]

基本上它将加入所有关键列。通常你加入一个键。如果确实需要指定非键列,可以随时将 data.table 转换为 data.frame 并使用标准的merge() 函数

merge(as.data.frame(dt1),dt2, by.x="a", by.y="x")
merge(as.data.frame(dt1),dt2, by.x="b", by.y="y")

【讨论】:

  • 您的建议是合理的,MrFlick,我知道键不必相同。这对我来说根本不是问题,但我觉得对于不小心(意识到?)这个问题的人(很可能是我的学生)来说,这很麻烦,而且可能容易出错。至于转换为基础data.frame,这不是首先破坏了使用data.table的全部目的吗?
  • 是的,它会破坏目的,但加入非键控(索引)列也是如此。所以你最好只是确保你的表是正确的。
【解决方案3】:

参考 Rdatatable github 页面,如果您想对联接执行功能而不仅仅是合并表,您还可以执行 d1[d2, somefunc, on = "A==W"],其中 A 是您在 d1 和 @987654325 中的列@ 是您在d2 中的专栏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 2011-12-31
    • 2012-08-08
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多