R 表引用语义:遍历所有列的内存使用

R 表引用语义:遍历所有列的内存使用,r,data.table,pass-by-reference,R,Data.table,Pass By Reference,当使用引用语义遍历R data.table中的所有列时,从内存使用的角度来看,什么更有意义: (1) dt[,(所有颜色):=lappy(.SD,我的乐趣)] 或 (2) lapply(colnames(dt),function(col)dt[,(col):=my_-fun(dt[[col]])[[1]] 我的问题是:在(2)中,我强制data.table逐列覆盖dt,因此我假设需要按列大小顺序的额外内存。第(1)项也是这样吗?或者在覆盖原始列之前是否对所有lappy(.SD,my_fun)进行

当使用引用语义遍历R data.table中的所有列时,从内存使用的角度来看,什么更有意义:

(1)
dt[,(所有颜色):=lappy(.SD,我的乐趣)]

(2)
lapply(colnames(dt),function(col)dt[,(col):=my_-fun(dt[[col]])[[1]]

我的问题是:在(2)中,我强制data.table逐列覆盖
dt
,因此我假设需要按列大小顺序的额外内存。第(1)项也是这样吗?或者在覆盖原始列之前是否对所有
lappy(.SD,my_fun)
进行了评估

运行上述变体的一些示例代码:

library(data.table)
dt <- data.table(a = 1:10, b = 11:20)
my_fun <- function(x) x + 1
all_cols <- colnames(dt)
库(data.table)

dt根据@Frank的建议,通过对每列应用函数
my_fun
来逐列替换data.table的最有效方法(从内存的角度来看)是

library(data.table)
dt <- data.table(a = 1:10, b = 11:20)
my_fun <- function(x) x + 1
all_cols <- colnames(dt)

for (col in all_cols) set(dt, j = col, value = my_fun(dt[[col]]))
库(data.table)

dt在我的头顶上,如果你打开了优化,内部(1)将转换为
(my_-fun(.SD[[1]]),…,my_-fun(.SD[[ncol(.SD)])
;尝试使用
verbose=TRUE
运行,并查看
?GForce
如果要像(2)中那样循环,最好使用
set
;参见
?设置
@MichaelChirico优化是为
j=。(…)
而不是为
:=
所以我想为
+
设置一个
循环是最好的,以最小化内存使用,正如你所建议的那样。@MichaelChirico你能详细说明一下我的问题与
GForce
的关系吗?根据文件(v1.11.4),这仅与以下情况有关:
my_fun
处于{
min
max
均值
中值
var
sd
sum
prod
第一位
最后一位
头位
尾位
,但不是针对任意的
my_fun
,对吗?请参见优化级别1:“表达式
DT[,lapply(.SD,fun),by=.]
优化为
DT[,list(fun(a),fun(b),…),by=.]
其中
a,b,…
.SD
中的列。这极大地提高了性能。”