在R中分配data.table切片

rim*_*rob 5 r data.table

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

foo = DT[, 5:10, with=F]
Run Code Online (Sandbox Code Playgroud)

但现在我想做:

foo = foo + 1
DT[, 5:10, with=F] = foo
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*wle 5

它有点微妙.这就是我如何阅读您的问题,以及您目前是如何尝试这样做的...

您的第一行创建了一个data.table包含6列列子集的新对象:

foo = DT[, 5:10, with=F]
Run Code Online (Sandbox Code Playgroud)

我马上想到了记忆的含义.如果每列为1GB,那么您只需分配6GB的新对象.

然后你对该6GB中的所有内容+1:

foo = foo + 1   # or something like that, that works
Run Code Online (Sandbox Code Playgroud)

这是6GB到另一个新的6GB的副本.

然后将6GB复制foo回原来DT的位置:

DT[, 5:10, with=F] = foo    # or something like that, that works
Run Code Online (Sandbox Code Playgroud)

这真的是内存效率低下的.这是一种基本的做事方式.

data.table你可以循环,你可以set.我只是在一个易于阅读和易于理解的循环中做到这一点.

for (col in 5:10)
    set(DT, j=col, value=DT[[col]]+1)
Run Code Online (Sandbox Code Playgroud)

这将逐个引用每列更改.DT[[col]]不复制列内容(这没什么特别的data.table,那是不复制的基础R).但它+1确实创造了一个新的载体.然而,新的向量随后砰的一声扔到直接进入列指针时隙,所以它的有效率,因为它可以被给予+1返回一个新的对象.