3

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

我想避免(i)设置和重置的键和(ii)使用不同的键x跟踪副本。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。有没有更好或更标准的方法来做到这一点?

似乎使用keykeyby不使用.SD都没有效果:

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

1 回答 1

3

在版本 1.9.5中,添加了参数,并在更改日志on中使用了此使用说明:

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

在这种情况下,由于合并列名称在xand中是相同的y,所以x[y,on=c("B","C")]可以工作。


历史答案(大约 1.8.11 版本)从 1.8.11 版本 [.data.table开始会有一个key参数,相当于setkeyv预先调用。这并不是这个问题所要寻找的,但我看不到在不复制整个数据的情况下实现这一目标的方法(糟糕的 imo),所以我认为这是一个合理的折衷方案,但如果您不这么认为,请告诉我。

从马修编辑

特别添加一个名为keyto的参数[.data.table是最近几天我还没有回应的一个新建议。例如,我们过去曾讨论过辅助键set2key。辅助键不会复制数据。

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

于 2013-09-29T03:49:27.267 回答