【发布时间】:2014-09-25 19:03:35
【问题描述】:
当使用 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.table 在不修改subkey 的情况下对subkey 采取行动key?
【问题讨论】:
-
我无法在 1.9.3 版中重现这一点。顺便说一句,您始终可以使用
copy显式复制,例如subkey = copy(key[c("x", "y")]) -
@eddi:我仍然在
data.table的 GitHub 版本中看到这一点。 编辑:最新的 Ubuntu 64 位 -
@edi 我正在使用 windows 和来自 GitHub 的
1.9.3产生相同的结果。也许特定于操作系统,或者您在其他地方获得您的 1.9.3 版本。 -
这是由于 R3.1+ 处理列子集的方式。它尽可能地浅拷贝。我建议您首先执行
setDT(key),然后执行subkey <- key[, c("x", "y"), with=FALSE]-data.table深拷贝中的列子集,以避免此问题。目前没有办法知道有多少引用被浅拷贝的列... -
@eddi,我们已经注意到了这一点#710。
标签: r data.table