为了读取data.table切片,我可以使用以下语法:
foo = DT[, 5:10, with=F]
但现在我想这样做:
foo = foo + 1
DT[, 5:10, with=F] = foo
这不起作用;按名称引用列似乎也不起作用。有什么建议吗?
答案 0 :(得分:5)
它有点微妙。这就是我如何阅读您的问题,以及您目前是如何尝试这样做的...
您的第一行创建了一个新的data.table
对象,其中包含6列的列子集:
foo = DT[, 5:10, with=F]
我立刻想到了记忆的含义。如果每列都是1GB,那就是你刚刚分配的6GB新对象。
然后你对那6GB中的所有内容+1:
foo = foo + 1 # or something like that, that works
这是6GB到另一个新的6GB的副本。
然后,首先将6GB foo
复制回DT
中的位置:
DT[, 5:10, with=F] = foo # or something like that, that works
这真的是内存效率低下的。这是一种基本的做事方式。
在data.table
中你可以循环播放,你可以set
。我只是在易于阅读和易于理解的循环中进行。
for (col in 5:10)
set(DT, j=col, value=DT[[col]]+1)
这将逐个引用每列更改。 DT[[col]]
不会复制列内容(data.table
中没有任何特殊内容,这是不复制的基本R)。但是+1
确实会创建一个新的向量。但是,新的向量然后 plonked 直接进入列指针槽,因此它的效率与+1
返回一个新对象的效率一样高。