data.tables的连接副本

时间:2016-08-09 07:47:25

标签: r data.table

在我的工作流程中,我经常制作主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的旧版本中也经历过。

1 个答案:

答案 0 :(得分:1)

您不应该data.frame看到此行为,但您会看到data.table个对象。

?data.table::copy解释了data.tables阻止尽可能创建副本,结果是在使用data.tableset*运算符修改:=之后,例如: / p>

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