This question already has answers here:
Understanding exactly when a data.table is a reference to (vs a copy of) another data.table

(2个答案)


5年前关闭。




当我复制一个data.table并修改新的表时,原始的表被更改了,我无法弄清楚。这是正常行为吗?
dt = data.table(zone=1:5, pc=11:15)
dtt = dt
dtt[, pc := pc*2 ]
dtt

       zone pc
    1:    1 22
    2:    2 24
    3:    3 26
    4:    4 28
    5:    5 30

dt

       zone pc
    1:    1 22
    2:    2 24
    3:    3 26
    4:    4 28
    5:    5 30

更明确地创建新的data.table时,我没有问题:dtt = data.table(dt)

最佳答案

当您将新变量分配给已存在的变量时,R不会创建副本,而只是指向新变量,这非常好,因为除非绝对需要,否则您不想复制副本-修改时复制。

此后,由于您使用了:=运算符(通过引用对其进行了修改),并且由于此刻两个对象都指向同一位置,因此它会反射(reflect)在两个对象上。

解决方法是使用data.table函数显式复制copy(),然后按如下方式通过引用进行分配:

dtt = copy(dt)     ## dt and dtt are not pointing to same locations anymore
dtt[, pc := pc*2]  ## assignment by reference doesn't affect dt

高温超导

关于R数据表的复制和修改更改了原始数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22956098/

10-09 17:08
查看更多