为了读取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)
这不起作用; 按名称引用列似乎也不起作用.有什么建议?
它有点微妙.这就是我如何阅读您的问题,以及您目前是如何尝试这样做的...
您的第一行创建了一个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返回一个新的对象.