R 如何以不同的列名合并两个data.table?

R 如何以不同的列名合并两个data.table?,r,merge,data.table,R,Merge,Data.table,我有两个数据。表X和Y X中的列:区域、id、值 Y中的列:ID、价格、销售 创建两个data.Table: 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'),

我有两个数据。表XY

X中的列
区域、id、值

Y中的列
ID、价格、销售

创建两个data.Table:

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)
              )
我为XY设置键:

setkey(X, id)
setkey(Y, ID)
merge(X, Y)
merge(X, Y, by=c('id', 'ID'))
merge(X, Y, by.x='id', by.y='ID')
现在我尝试通过X中的
id
Y中的
id
加入XY

setkey(X, id)
setkey(Y, ID)
merge(X, Y)
merge(X, Y, by=c('id', 'ID'))
merge(X, Y, by.x='id', by.y='ID')
All引发错误,指出
by
参数中的列名无效

我参考了data.table手册,发现
merge
函数不支持
by.x
by.y
参数

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

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

过时的
使用此操作:

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
或此操作:

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]和合并(X,Y)之间的区别是什么?”这导致我签出了
?合并
,我发现有两个不同的合并函数,具体取决于您使用的软件包。默认值为
merge.data.frame
,但data.table使用
merge.data.table
。比较

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.


编辑完整性基于@Michael Bernsteiner的一个命令,它看起来像是
数据表
团队计划将
by.x
by.y
实现到
合并.data.table
函数中,但是还没有这样做。

当您将
by.x
by.y
data.table
一起使用时,合并失败。获取您的数据:

> merge(X,Y, by.x='id', by.y='ID')
Error in merge.data.table(X, Y, by.x = "id", by.y = "ID")
可以将
data.table
与merge一起使用,但需要使用
by
参数进行连接(因此重命名列以使其具有相同的
colnames

这仍然不起作用:

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
或者,您需要将
data.table
转换为
data.frame
,以便将
merge
by.x
by.y
参数一起使用:

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

data.table
1.9.6版(2015年9月在CRAN上)开始,您可以在
data.table::merge
中指定
by.x
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.table 1.9.6中,您还可以指定
X[Y]
符号中的
on
参数

X[Y]语法现在可以通过使用新的on参数进行连接,而无需设置键。例如:DT1[DT2,on=c(x=“y”)]将DT2的列“y”与DT1的“x”连接起来。DT1[DT2,on=“y”]将连接两个data.tables的列“y”


通过
数据表
作者有更多详细信息

您还可以使用具有不同名称的多个列进行合并。见下面的例子

# create data frame authors
authors <- data.frame(
FirstName=c("Lorne", "Loren", "Robin",
              "Robin", "Billy"),
LastName=c("Green", "Jaye", "Green",
             "Howe", "Jaye"),
Age=c(82, 40, 45, 2, 40),
Income=c(1200000, 40000, 25000, 0, 27500),
Home=c("California", "Washington", "Washington",
    "Alberta", "Washington"))

# create data frame books Note First name in authors is same as AuthorFirstname same thing with lastname.
books <- data.frame(
        AuthorFirstName=c("Lorne", "Loren", "Loren",
            "Loren", "Robin", "Rich"),
        AuthorLastName=c("Green", "Jaye", "Jaye", "Jaye",
            "Green", "Calaway"),
        Book=c("Bonanza", "Midwifery", "Gardening",
        "Perennials", "Who_dun_it?", "Support"))

merge(authors, books, by.x=c("FirstName", "LastName"),
      by.y=c("AuthorFirstName", "AuthorLastName"),
      all.x=TRUE)
#创建数据帧作者

作者请检查或@akrun谢谢。我检查了两个柱子。我通过
X[Y]
成功地连接了X和Y,但我仍然无法通过使用
merge
函数来完成。我对为什么
merge
在data.table.by.x和by.y中失败感到非常困惑。已提交FR。截至2015年9月,CRAN上的
data.table v1.9.6
中提供了
by
参数。请参阅修改所接受的答案。您也可以做<代码>库(DPLYR);XY给出了
数据的更新。表
这个答案不再正确。使用第一个或第二个merthod更好吗?@skan-我不确定哪一个更好。请注意,默认情况下,
data.table::merge
设置
sort=TRUE
,这将在结果数据上设置一个键。如果你不使用钥匙,这是需要注意的