在我的工作流程中,我经常制作主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的旧版本中也经历过。
答案 0 :(得分:1)
您不应该data.frame
看到此行为,但您会看到data.table
个对象。
?data.table::copy
解释了data.tables阻止尽可能创建副本,结果是在使用data.table
或set*
运算符修改:=
之后,例如: / 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
A
和B
仍然相同(即元素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