切断密钥和data.frame之间的范围链接,用于data.table

时间:2014-09-25 19:03:36

标签: r data.table

使用 data.table 作为查找时,速度非常快。有一种行为不适用于我当前的工作流程,我确信这是一种更好的方式而且我错过了它。即使密钥是从父data.frame获取的,行为也是在原地修改的行为, data.table 将以不一定总是如此的方式对父data.frame采取行动。合乎需要的。

这是一个例子,因为我缺乏正确表达它的语言:

library(data.table)

set.seed(123)
N <- 100

key <- data.frame(x = sample.int(N, N), y = 1:N, z = 1:N)
key$w <- key$x
head(key)
##    x y z  w
## 1 29 1 1 29
## 2 79 2 2 79
## 3 41 3 3 41
## 4 86 4 4 86
## 5 91 5 5 91
## 6  5 6 6  5

set.seed(1)
terms <- data.frame(z = sample.int(2 * N, 1e2, replace = TRUE))
subkey <- key[c("x", "y")]

setDT(subkey)
setDT(terms)

setkey(subkey, x)
subkey[terms][[2]]

head(key)
##   x  y z w
## 1 1 74 1 1
## 2 2 35 2 2
## 3 3 51 3 3
## 4 4 18 4 4
## 5 5  6 5 5
## 6 6 54 6 6

请注意,key的顺序会因使用data.table而受到影响,即使它未在查找中使用过吗?

我知道data.table正在避免制作副本,但有办法将此链接切换为key并强制data.tablesubkey上操作而不修改key }?

1 个答案:

答案 0 :(得分:3)

而不是

subkey <- key[c("x", "y")]
setDT(subkey)

只是做

subkey <- as.data.table(key[c("x", "y")])

这将强制复制并切断连接