R 如何以不同的列名合并两个data.table?
我有两个数据。表X和Y X中的列: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'),
区域、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)
)
我为X和Y设置键:
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
加入X和Y:
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
,这将在结果数据上设置一个键。如果你不使用钥匙,这是需要注意的