我有一个键控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
答案 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”列。
在这种情况下,由于合并列名称在x
和y
中相同,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时,可以依赖它。