【问题标题】:cut scoping link between key and data.frame for data.table为 data.table 切断 key 和 data.frame 之间的范围链接
【发布时间】: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 &lt;- key[, c("x", "y"), with=FALSE] - data.table 深拷贝中的列子集,以避免此问题。目前没有办法知道有多少引用被浅拷贝的列...
  • @eddi,我们已经注意到了这一点#710

标签: r data.table


【解决方案1】:

而不是

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

只是做

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

这将强制复制并切断连接

【讨论】:

  • 我认为这是对工作流程最简单的解决方法。谢谢你的建议。
猜你喜欢
  • 2021-06-23
  • 2019-06-30
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 2020-12-18
  • 2013-08-02
  • 1970-01-01
相关资源
最近更新 更多