r - data.table与合并后的键和X [Y]连接的不同行为

时间:2016-01-29 01:18:30

标签: r data.table

考虑data.table s

library(data.table)   ## v1.9.7 (dev version)
#  rm(list=ls())
dt1 <- data.table(id=c(1,2,3),
                val=c(3,2,1))

dt2 <- data.table(id=c(1,2,3),
                val2=c(100,200,300))

此处,没有为表格分配任何键

tables()
#     NAME NROW NCOL MB COLS    KEY
#[1,] dt1     3    2  1 id,val     
#[2,] dt2     3    2  1 id,val2    
#Total: 2MB

使用两个不同的data.table联接操作时

dt_merge <- merge(dt1, dt2, by=c("id"))
dt_bracket <- dt1[ dt2, on=c("id")]

我们看到merge函数指定了一个键,但X[Y]没有

#     NAME       NROW NCOL MB COLS        KEY
#[1,] dt_bracket    3    3  1 id,val,val2    
#[2,] dt_merge      3    3  1 id,val,val2 id 
#[3,] dt1           3    2  1 id,val         
#[4,] dt2           3    2  1 id,val2               

如果我们使用两个data.tables,其中连接列具有不同的名称,则将该键指定为X连接列:

#  rm(list=ls())
dt1 <- data.table(id=c(1,2,3),
                val=c(3,2,1))

dt2 <- data.table(id2=c(1,2,3),
                val2=c(100,200,300))


dt_merge <- merge(dt1, dt2, by.x=c("id"), by.y=c("id2"))
dt_bracket <- dt1[ dt2, on=c(id = "id2")]
tables()
#     NAME       NROW NCOL MB COLS        KEY
#[1,] dt_bracket    3    3  1 id,val,val2    
#[2,] dt_merge      3    3  1 id,val,val2 id 
#[3,] dt1           3    2  1 id,val         
#[4,] dt2           3    2  1 id2,val2       

我在PDF FAQ - 1.12the CRAN documentation中找不到解释为什么在merge之后分配密钥的说明。

由于这引起了我几次unique()次来电,我想知道这是否是这种预期行为?

更新 - 解决方案

正如弗兰克指出的那样,答案在于sort论证

dt_merge_sort <- merge(dt1, dt2, by=c("id"))
dt_merge_notSort <- merge(dt1, dt2, by=c("id"), sort=FALSE)

tables()

#     NAME             NROW NCOL MB COLS        KEY
#[1,] dt1                 3    2  1 id,val         
#[2,] dt2                 3    2  1 id,val2        
#[3,] dt_merge_notSort    3    3  1 id,val,val2    
#[4,] dt_merge_sort       3    3  1 id,val,val2 id 

1 个答案:

答案 0 :(得分:6)

在我看来,?merge.data.table为其sort参数记录了这一点:

  

如果为TRUE(默认值),则通过将键设置为by / by.x列来对合并的data.table进行排序。如果为FALSE,则结果未排序。