暂时键入data.table进行合并

时间:2013-06-07 18:31:33

标签: r data.table

我有一个键控data.table,x,并且意识到我需要使用不同的多列键合并它。

我想避免(i)设置和重置x的密钥,以及(ii)跟踪具有不同密钥的x的副本。以下是一些示例数据和我目前的方法:

require(data.table)
options(datatable.verbose=TRUE)
set.seed(1)
n    <- 10
m    <- 2
samp <- function(n) sample(1:9,n,replace=T)
x    <- data.table(A = samp(n),B = samp(n),C = samp(n),key="A")
y    <- x[samp(m),list(B,C,D=samp(m))]

# this works:
x[,.SD,key="B,C"][y]
#    B C A D
# 1: 7 6 6 5
# 2: 9 4 6 2

所以这种方法有效,但我得到了评论

  

... j是一个命名列表。这是非常低效的......

命名列表为.SD。是否有更好或更标准的方法来做到这一点?

似乎在没有key的情况下使用keyby.SD无效:

key(x[,,keyby="B,C"]) # A
key(x[,,key="B,C"]) # A

1 个答案:

答案 0 :(得分:3)

在版本1.9.5 中,添加了on参数,并在changelog中使用了此使用说明:

  

data.tables现在可以加入,而无需使用新的on参数设置密钥。例如:DT1[DT2, on=c(x = "y")]会将DT2的第'y'列与DT1的'x'连接起来。 DT1[DT2, on="y"]将加入data.tables上的“y”列。

在这种情况下,由于合并列名称在xy中相同,x[y,on=c("B","C")]有效。


历史回答(版本1.8.11左右)As of version 1.8.11 [.data.table将有一个key参数,相当于调用setkeyv预先。这不是这个问题的主要内容,但我没有看到实现这一目标的方法而不复制整个数据(坏的imo),所以我认为这是一个合理的妥协,但如果您不这么认为,请告诉我。

从马修编辑

特别是将一个名为key的参数添加到[.data.table是过去几天我还没有回复的新建议。我们过去曾讨论过二级密钥,例如set2key。辅助密钥不会复制数据。

我们会在列表中进行讨论,但我认为key中的[.data.table可能会更改名称或以不同方式完成。提醒互联网:v1.8.11正处于开发阶段,不稳定且具有实验性。当它发布到CRAN时,可以依赖它。