【问题标题】:Connected copies of data.tables [duplicate]data.tables 的连接副本 [重复]
【发布时间】:2016-08-09 07:47:25
【问题描述】:

在我的工作流程中,我经常制作一份主要的 data.frame/data.table 的副本,我在其中做一些工作,然后在另一个副本上做一些其他工作,然后再加入它们或稍后进行其他操作。但是,我经常体验到这些副本仍然相互连接。所以在一个上完成的编辑也会在另一个上完成。不幸的是我无法复制它,但是从我的控制台复制粘贴它看起来像这样:

# 'used3' is a copy of 'used' with some altercations to it 
c("nLocs","nDays") %in% names(used)
[1] FALSE FALSE
> used3[, nDays :=uniqueN(yDay),c("ID","Year","Season")]
> used3[, nLocs :=.N,c("ID","Year","Season")]
> c("nLocs","nDays") %in% names(used)
[1] TRUE TRUE

因此对副本所做的更改也将在原件上进行。这是一个错误吗?我是不是叫他们的名字太相似了……还是什么?

R 版本:3.3 data.table 版本:1.9.6

但在 R 和 data.table 的旧版本中也有经验

【问题讨论】:

  • ?data.table::copy
  • 谢谢!那是其中之一“我怎么错过了?!”。您是否应该将其添加为答案以便我接受?
  • 另见this 和链接的问题。还有this

标签: r data.table


【解决方案1】:

data.frame 不应该出现这种行为,但data.table 对象会出现这种情况。

?data.table::copy 解释说 data.tables 尽可能防止创建副本,结果是在使用set*:= 运算符修改data.table 后,例如:

library(data.table)
A <- data.table(x=1:10)
B <- A
A[, y:=10:1]

B
##      x  y
##  1:  1 10
##  2:  2  9
##  3:  3  8
##  4:  4  7
##  5:  5  6
##  6:  6  5
##  7:  7  4
##  8:  8  3
##  9:  9  2
## 10: 10  1

AB 仍然相同(即元素 y 已添加到两者中)。

最重要的是,要复制data.table,您可以改为:

A <- data.table(x=1:10)
B <- copy(A)
A[, y:=10:1]

B
##      x
##  1:  1
##  2:  2
##  3:  3
##  4:  4
##  5:  5
##  6:  6
##  7:  7
##  8:  8
##  9:  9
## 10: 10

请注意,使用$ 运算符将元素添加到data.table 确实会导致复制:

A <- data.table(x=1:10)
B <- A
A$y <- 10:1

B
##      x
##  1:  1
##  2:  2
##  3:  3
##  4:  4
##  5:  5
##  6:  6
##  7:  7
##  8:  8
##  9:  9
## 10: 10

【讨论】:

    猜你喜欢
    • 2011-12-16
    • 2013-03-06
    • 2014-05-07
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多