考虑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.12或the 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
答案 0 :(得分:6)
在我看来,?merge.data.table
为其sort
参数记录了这一点:
如果为TRUE(默认值),则通过将键设置为by / by.x列来对合并的data.table进行排序。如果为FALSE,则结果未排序。