当在data.table中对具有不同名称的表使用Y [X]进行左连接时,我想保留表X中的列名,这里表示为 myx 。
myx <- data.table(value = 1:10, key1 = letters[1:10], key2 = toupper(letters[1:10]) )
myy <- data.table(value2 = 101:120, diffkey1 = letters[1:20], diffkey2 = toupper(letters[1:20]) )
setkey(myx, 'key1', 'key2')
setkey(myy, 'diffkey1', 'diffkey2')
(myx <- myy[myx])
value2 diffkey1 diffkey2 value
1: 101 a A 1
2: 102 b B 2
3: 103 c C 3
4: 104 d D 4
5: 105 e E 5
6: 106 f F 6
7: 107 g G 7
8: 108 h H 8
9: 109 i I 9
10: 110 j J 10
# this is the step I would like to avoid
setnames(myx,
old = c('diffkey1', 'diffkey2'),
new = c('key1', 'key2'))
最后我必须重置名称,并希望避免这一步骤。
答案 0 :(得分:1)
您会考虑在开头更改密钥的名称吗?
myx <- data.table(value = 1:10, key1 = letters[1:10], key2 = toupper(letters[1:10]) )
myy <- data.table(value2 = 101:120, key1 = letters[1:20], key2 = toupper(letters[1:20]) )
setkey(myx, 'key1', 'key2')
setkey(myy, 'key1', 'key2')
(myx <- myy[myx])
或者你可以扭转一切
library(data.table)
myx <- data.table(value = 1:10, diffkey1 = letters[1:10], diffkey2 = toupper(letters[1:10]) )
myy <- data.table(value2 = 101:120, key1 = letters[1:20], key2 = toupper(letters[1:20]) )
setkey(myx, 'diffkey1', 'diffkey2')
setkey(myy, 'key1', 'key2')
(myx <- myy[myx])
答案 1 :(得分:1)
您也可以在加入时使用:=
查找列
您当然可以为预期的列名定制LHS。
library(data.table)
lkp_cols <- names(Y)
X[Y, c(lkp_cols) := mget(paste0("i.",lkp_cols))]
当您预期加入时出现行爆炸时,这将不起作用。
答案 2 :(得分:0)
myx[myy,nomatch=0L]
怎么样?不要认为它一般就这么简单,但它适用于你的例子。