为什么在添加新列时会复制data.table?

时间:2016-02-12 12:10:10

标签: r data.table

当新列添加到从磁盘加载的data.table时,它会被复制。

library('data.table')
dt <- data.table(a=1,b=2)
save.image("test.RData")
load("test.RData")
dt
$   a b
$1: 1 2

class(dt)
$[1] "data.table" "data.frame"

address(dt)
$[1] "00000000046F1F38"  

dt[, b := NULL]
address(dt)
$[1] "00000000046F1F38"
dt[, c := 2]
address(dt)
$[1] "000000000D815618"

这是一个错误还是我做错了什么?我正在使用data.table包的1.9.6

1 个答案:

答案 0 :(得分:9)

data.table通过在创建data.table时为列向量列表过度分配指针槽来添加列时避免复制。当您像这样加载data.table时,过度分配没有发生,并且在添加列后完成。这需要一份副本。

library('data.table')
dt <- data.table(a=1,b=2)
save.image("test.RData")
load("test.RData")

truelength(dt)
#[1] 0

dt[, b := NULL]
truelength(dt)
#[1] 0

dt[, c := 2]
truelength(dt)
#[1] 101

引用help("truelength")

  

对于从磁盘加载的表,但是,在R 2.14.0中,truelength为0,在R <= 2.13.2中为随机;也就是说,在这两种情data.table检测此状态,并在下一列添加或删除发生时过度分配已加载的data.table。 data.table上的所有其他操作(例如快速分组和连接)不需要truelength。

由于在删除列期间没有发生复制,因此文档似乎略有过时。

请注意,如果添加的列数多于在“正常”创建data.table期间过度分配的列,则也会发生副本。