如何在data.table,Y [X]中为两个具有不同名称的表执行左连接,并保留X的列名?

时间:2015-07-13 23:24:51

标签: r data.table

当在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'))

最后我必须重置名称,并希望避免这一步骤。

3 个答案:

答案 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]怎么样?不要认为它一般就这么简单,但它适用于你的例子。