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

时间:2015-04-25 13:02:24

标签: r merge data.table

我有两个data.table X Y

X 中的

列:area, id, value
Y 中的列:ID, price, sales

创建两个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 id加入 X Y ,在加入ID ÿ

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

所有引发的错误都表示by参数中的列名无效。

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

如何以不同的列名加入两个data.tables而不更改列名

追加
我设法通过X[Y]加入这两个表,但为什么merge函数在data.table中失败?

4 个答案:

答案 0 :(得分:25)

截至data.table版本1.9.6(2015年9月CRAN上),您可以在by.x

中指定by.ydata.table::merge个参数
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中,您可以指定on表示法中的X[Y]参数

  

X [Y]语法现在可以加入,而无需使用new on参数设置键。例如:DT1 [DT2,on = c(x =" y")]将加入列" y" DT2与" x" DT1。 DT1 [DT2,on =" y"]将加入列" y"两个data.tables。

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作者的

this answer有更多详情

答案 1 :(得分:16)

使用此操作:

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
编辑问题后,

编辑,我阅读了FAQ的第1.12节:" X [Y]和合并(X,Y)之间的差异是什么? ",这导致我结账?merge,我发现有两种不同的合并功能取决于你使用的包。默认值为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.

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 Bernsteiner的comment

编辑完整性,看起来data.table小组计划实施by.x和{{1}进入by.y函数,但还没有完成。

答案 2 :(得分:4)

by.xby.ydata.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进行合并,但需要使用by参数进行加入(因此将列重命名为colnames

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

或者,您需要将data.table转换为data.frame才能将mergeby.xby.y参数一起使用:

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

答案 3 :(得分:1)

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

# 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)