我注意到在使用不同的赋值运算符时,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/