r - 数据表1.8.1。 : “DT1 = DT2” is not the same as DT1 = copy(DT2)?

标签 r data.table

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

请执行以下命令,您将明白我的意思

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的文档中:

The data.table is modified by reference, and returned (invisibly) so it can be used in compound statements; e.g., setkey(DT,a)[J("foo")]. If you require a copy, take a copy first (using DT2=copy(DT)). copy() may also sometimes be useful before := is used to subassign to a column by reference. See ?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/

相关文章:

r - data.table 用子字符串替换列

r - dplyr case_when 的 data.table 替代方案

r - 使用 data.table 包通过引用进行条件二进制连接和更新

r - 将行添加到数据框,同时维护每列的类

R有条件替换为 '['且没有子集()

r - 如何删除R数据框中的列

c++ - 特殊值不能用作 unordered_map 中的键

通过fread()使用row.names读取CSV

r - 对齐 R date.table 中的日期以进行线性回归

r - 在 data.table 中删除行后移动数字集