为了读取 data.table 切片,我可以使用以下语法:
foo = DT[, 5:10, with=F]
但现在我想做:
foo = foo + 1
DT[, 5:10, with=F] = foo
这不起作用;按名称引用列似乎也不起作用。有什么建议?
最佳答案
它更微妙一些。这就是我如何阅读您的问题以及您目前正在尝试如何做...
您的第一行创建了一个新的 data.table
具有 6 列列子集的对象:
foo = DT[, 5:10, with=F]
我立即想到了内存影响。如果每列是 1GB,那就是您刚刚分配的 6GB 新对象。
然后你 +1 到 6GB 中的所有内容:
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
那真的是内存效率低下。这是一种基本的 R 做事方式。
在
data.table
你可以循环,你可以 set
.我只会在一个易于阅读和易于理解的循环中完成它。for (col in 5:10)
set(DT, j=col, value=DT[[col]]+1)
这将通过引用一一更改每一列。
DT[[col]]
不复制列内容(在 data.table
中没有什么特别之处,这是不复制的基础 R)。但是+1
确实创建了一个新向量。然而,这个新向量然后被直接插入到列指针槽中,所以它的效率与+1
一样有效。返回一个新对象。
关于r - 在 R 中分配 data.table 切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21100883/