在R中分配data.table切片

时间:2014-01-13 20:38:56

标签: r data.table

为了读取data.table切片,我可以使用以下语法:

foo = DT[, 5:10, with=F]

但现在我想这样做:

foo = foo + 1
DT[, 5:10, with=F] = foo

这不起作用;按名称引用列似乎也不起作用。有什么建议吗?

1 个答案:

答案 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返回一个新对象的效率一样高。