我注意到使用不同的赋值运算符时 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
这是预期的行为吗?
是的。这是预期的行为,并且有据可查。
Since data.table
使用对原始对象的引用来实现就地修改,速度非常快。
出于这个原因,如果您really想要复制数据,你需要使用copy(DT)
从文档中?copy
:
data.table 通过引用修改,并返回(不可见)
它可以用在复合语句中;例如。,setkey(DT,a)[J("foo")]
。
如果您需要副本,请先获取副本(使用DT2=copy(DT)
). copy()
之前有时也可能有用:=
用于子分配给
参考列。看?copy
.
另请参阅这个问题:准确理解 data.table 何时是对另一个 data.table 的引用或副本 https://stackoverflow.com/questions/10225098/understanding-exactly-when-a-data-table-is-a-reference-to-vs-a-copy-of-another
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)