我有两个数据。表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 中失败?
使用<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')
使用此操作:
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.x
和 by.y
实施到 merge.data.table
函数中,但尚未这样做。
从< 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中进行此操作吗?所需的输出: 请帮忙,谢谢! 问题答案: 结帐。就您而言,您甚至不需要任何标志: