当前位置: 首页 > 知识库问答 >
问题:

如何通过不同的列名合并两个data.table?

卢权
2023-03-14

我有两个数据。表X和表Y。

列 X: 面积、 ID,
Y 中的值列: ID, 价格, 销售额

创建两个data.tables:

X = data.table(area=c('US', 'UK', 'EU'),
               id=c('c001', 'c002', 'c003'),
               value=c(100, 200, 300)
              )

Y = data.table(ID=c('c001', 'c002', 'c003'),
               price=c(500, 200, 400),
               sales=c(20, 30, 15)
              )

我设置了 X 和 Y 的键:

setkey(X, id)
setkey(Y, ID)

现在,我尝试通过X中的< code>id和Y中的< code>ID来连接X和Y:

merge(X, Y)
merge(X, Y, by=c('id', 'ID'))
merge(X, Y, by.x='id', by.y='ID')

All引发错误,指出by参数中的列名无效。

我查阅了data.table的手册,发现< code>merge函数不支持< code>by.x和< code>by.y参数。

如何在不更改列名的情况下通过不同的列名连接两个data.tables?

追加:
我设法通过 X[Y] 连接了两个表,但是为什么合并函数在 data.table 中失败?

共有3个答案

井旺
2023-03-14

使用<code>by时合并失败。x和由。y数据。表。获取您的数据:

> merge(X,Y, by.x='id', by.y='ID')
Error in merge.data.table(X, Y, by.x = "id", by.y = "ID")

您可以使用data.table合并,但您需要使用by参数进行连接(因此重命名列以具有相同的colname

Y = setNames(Y,c('id','price','sales'))

这仍然行不通:

merge(X,Y, by.x='id', by.y='id')
Error in merge.data.table(X, Y, by.x = "id", by.y = "id") :

但这将起作用:

> merge(X,Y, by='id')
#     id area value price sales
#1: c001   US   100   500    20
#2: c002   UK   200   200    30
#3: c003   EU   300   400    15

或者,您需要转换<code>数据。表至数据。帧以便使用<code>将和由。y参数:

merge(data.frame(X), data.frame(Y), by.x='id', by.y='ID')
邰伟彦
2023-03-14

使用此操作:

X[Y]
#    area   id value price sales
# 1:   US c001   100   500    20
# 2:   UK c002   200   200    30
# 3:   EU c003   300   400    15

或者这个操作:

Y[X]
#      ID price sales area value
# 1: c001   500    20   US   100
# 2: c002   200    30   UK   200
# 3: c003   400    15   EU   300

编辑 编辑 后,我阅读了常见问题解答的第 1.12 节:“X[Y] 和 merge(X,Y)之间的分歧是什么?”,这导致我签出 ?merge,我发现有两种不同的合并函数,具体取决于您使用的包。默认值为合并,但数据表使用合并。比较

merge(X, Y, by.x = "id", by.y = "ID") # which is merge.data.table
# Error in merge.data.table(X, Y, by.x = "id", by.y = "ID") : 
# A non-empty vector of column names for `by` is required.

随着

merge.data.frame(X, Y, by.x = "id", by.y = "ID")
#     id area value price sales
# 1 c001   US   100   500    20
# 2 c002   UK   200   200    30
# 3 c003   EU   300   400    15

根据@Michael伯恩斯坦纳的评论进行编辑以确保完整性,看起来 data.table 团队正计划将 by.xby.y 实施到 merge.data.table 函数中,但尚未这样做。

萧无尘
2023-03-14

从< code>data.table版本1 . 9 . 6(2015年9月CRAN上)开始,您可以在< code>data.table::merge中指定< code>by.x和< code>by.y参数

merge(x=X, y=Y, by.x="id", by.y="ID")[]
#     id area value price sales
#1: c001   US   100   500    20
#2: c002   UK   200   200    30
#3: c003   EU   300   400    15

但是,在data.table1.9.6中,您还可以在X[Y]符号中推测on参数

X[Y]语法现在可以通过使用新的on参数连接,而不必设置键。例如:DT1[DT2,on=c(x = "y")]会将DT2的“y”列与DT1的“x”列连接起来。DT1[DT2,on="y"]将连接两个数据表的“y”列。

X[Y, on=c(id = "ID")]
#   area   id value price sales
#1:   US c001   100   500    20
#2:   UK c002   200   200    30
#3:   EU c003   300   400    15

data.table作者的回答有更多细节

 类似资料:
  • 问题内容: 我有以下两个玩具字典 我想得到一个唯一的字典,在其中我将第二个字典值堆叠在第一个字典之后,并放在相同的方括号内。 我尝试了以下代码 但是我获得的输出在每个键的列表中有两个列表,即 而我想获得 如何使用一行或两行代码来实现? 问题答案: 您几乎拥有了它,而是使用了附加两个列表的方法:

  • 但是,要添加到我的txt文件中的事务列表的类型是Transaction,而不是String。 作为一个例子,这里有一些用户存款情况下的代码。 理想情况下,我希望代码读取用户以前的事务,将他们的新事务添加到txt文件的末尾,然后在用户完成时将所有这些事务保存到同一个txt文件中。有没有一种方法可以读取用户以前的事务类型为Transaction而不是String,或者以某种方式将这两个列表组合起来,给

  • 我正在尝试合并两个不同类型的列表。我得到了两个不同的API响应从改造在一个android应用程序,第一个列表是一个电影列表定义为 公共类列表{ 我通过以下操作成功地从API中检索到列表 然后,我尝试将一个类型列表和一个类型字符串列表组合起来,以创建一个新类ListingAndImage(字符串是一个URL,我将加载到imageview中) 我的问题是,哪种方式最好将这两个列表组合起来,形成一个列表

  • 问题内容: 尝试查看是否有任何JavaScript库功能可以合并两个json对象的特定键的值 使用$ .extend和$ .merge给出以下结果 我正在寻找的是 问题答案: 您想深入扩展

  • 我有以下XML结构: 我想将其转换(合并)为以下结构: 我们可以假设,对于相同的id,没有重复的节点或属性。 目前,我正在使用

  • 问题内容: 我想通过unix中的一列合并两个文件。 我有file_a: 我还有另一个file_b: 我想在命令行中合并这些文件。我想按主题合并文件a和b。由于每个文件的长度约为200万行,因此我在R中进行了尝试,但由于数据量而冻结,有人可以帮助我在Linux中进行此操作吗?所需的输出: 请帮忙,谢谢! 问题答案: 结帐。就您而言,您甚至不需要任何标志: