基于不同列名连接表格

3
我正在观看Greg Reda关于Pandas的视频[1],了解Pandas能做什么以及它与data.table相比如何。 令人惊讶的是,我发现在data.table中连接表格非常困难。如果您观看视频,尤其是在@49:00至@52:00分钟之间,您将会发现Pandas允许您基于不同的列名连接表格,并且您可以选择左右表格的不同后缀。 我知道setkey用于优化目的[2],并且知道如何使用相同列名连接表格[3]。 我尝试使用data.table的merge,但很难使用不同的列名设置by=关键字参数。 所以这里有我的问题。

在data.table中,是否可能基于不同的列名连接表格? 如果可以,怎么做? 如果不行,为什么?此外,更有用的是,这个功能不是很有用吗? 我觉得这个问题早该被提出来了。如果以前已经讨论过,请原谅我(并请指引我),让我知道在哪里可以找到相关信息。

顺便说一下,Greg所讲述的数据可以在他的github[4]上找到。

  1. https://www.youtube.com/watch?v=1uVWjdAbgBg
  2. https://dev59.com/pWYr5IYBdhLWcg3wb5rc#13686768
  3. 使用R data.table在具有相同(非键)列名的表中连接表
  4. https://github.com/gjreda/pydata2014nyc

Vijay,这两个功能都已经在1.9.5中实现了。如果您有其他改进建议,请在Github页面上告诉我们。谢谢。 - Arun
谢谢,Arun。现在,data.table的行为更像普通的data.frame了。现在我可以更频繁地使用data.table! - Vijay
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - rafa.pereira
3个回答

6

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


数据表中加入至少这些改进是可能的。

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

  • 使用辅助键连接使用上述两种形式,而无需设置键,而是通过在xi上指定列来完成。

最简单的原因是我们还没有亲自尝试过。


感谢@Arun。我喜欢by.xby.y参数。我一点也不抱怨。我真的很喜欢data.table并希望它成功。我正在学习data.table的内部/代码,一旦我能够贡献,我会尽快加入。 - Vijay
@Vijay,别担心。我没想到你是这样的人。很高兴你正在学习内部知识。如果你有问题/困难,可以给我(和/或Matt)发电子邮件(请参见github项目页面)。祝你好运:-)。 - Arun

2

通常,在连接数据表时,列名实际上并不重要。您只需要确保两个表具有兼容的键即可。

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.table的初衷吗? - Vijay
是的,这样做会失去意义,但在非键(索引)列上进行连接也是如此。因此,最好确保您的表已正确建立键。 - MrFlick

1

关于 Rdatatable github 页面的参考,如果您想在连接表格时执行函数而不仅仅是合并表格,您也可以执行 d1[d2, somefunc, on = "A==W"],其中 A 是您在 d1 中的列,W 是您在 d2 中的列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接