我注意到在使用不同的赋值运算符时,data.table中存在一些不一致的行为(对我而言是不一致的)。我必须承认,我从来没有完全了解“=”和copy()之间的区别,所以也许我们可以在这里阐明一些信息。如果您使用“=”或“
请执行以下命令,您将明白我的意思

library(data.table)
example(data.table)

DT
   x y  v
1: a 1 42
2: a 3 42
3: a 6 42
4: b 1  4
5: b 3  5
6: b 6  6
7: c 1  7
8: c 3  8
9: c 6  9

DT2 = DT

现在,我将更改DT2的v列:
DT2[ ,v:=3L]
   x y  v
1: a 1  3
2: a 3  3
3: a 6  3
4: b 1  3
5: b 3  3
6: b 6  3
7: c 1  3
8: c 3  3
9: c 6  3

但看看DT发生了什么:
DT
   x y  v
1: a 1  3
2: a 3  3
3: a 6  3
4: b 1  3
5: b 3  3
6: b 6  3
7: c 1  3
8: c 3  3
9: c 6  3

它也改变了。
所以:更改DT2更改了原始DT。如果我使用copy(),则不是这样:
example(data.table)  # reset DT
DT3 <- copy(DT)
DT3[, v:= 3L]
   x y  v
1: a 1  3
2: a 3  3
3: a 6  3
4: b 1  3
5: b 3  3
6: b 6  3
7: c 1  3
8: c 3  3
9: c 6  3

DT
   x y  v
1: a 1 42
2: a 3 42
3: a 6 42
4: b 1  4
5: b 3  5
6: b 6  6
7: c 1  7
8: c 3  8
9: c 6  9

这是预期的行为吗?

最佳答案

是的。这是预期的行为,并且有据可查。

由于data.table使用对原始对象的引用来实现就地修改,因此它非常快。

因此,如果确实是要复制数据,则需要使用copy(DT)
?copy的文档中:



另请参阅此问题:
Understanding exactly when a data.table is a reference to vs a copy of another

关于r - 数据表1.8.1。 : “DT1 = DT2” is not the same as DT1 = copy(DT2)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11192325/

10-12 17:24