gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:57:14 24 4
gpt4 key购买 nike

将新列添加到从磁盘加载的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

最佳答案

在创建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"):

For tables loaded from disk however, truelength is 0 in R 2.14.0 and random in R <= 2.13.2; i.e., in both cases perhaps unexpected. data.table detects this state and over-allocates the loaded data.table when the next column addition or deletion occurs. All other operations on data.table (such as fast grouping and joins) do not need truelength.



似乎文档有些过时了,因为在删除列期间不会进行复制。

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

关于r - 为什么在添加新列时会复制data.table?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35362336/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com