我最近在一些旧代码中注意到,在对a data.table进行子集化并重复执行函数时(包括计算相关矩阵),我一直包括额外的方括号.所以,
# Slow way
rcorr(DT[subgroup][, !'Group', with=F])
# Faster way
rcorr(DT[subgroup, !'Group', with=F])
Run Code Online (Sandbox Code Playgroud)
(差异在于之后subgroup).出于好奇,为什么会出现这种情况?使用额外的括号,是否data.table必须执行一些额外的计算?
这是一个简单的解释:
# Slow way
rcorr(DT[subgroup][, !'Group', with=F])
Run Code Online (Sandbox Code Playgroud)
第二组括号是第二个操作DT,意味着从该DT[subgroup]数据表创建新数据表DT,然后[, !'Group', with = F]对该数据表进行操作,从而创建另一个新数据表.因此速度下降.
# Faster way
rcorr(DT[subgroup, !'Group', with=F])
Run Code Online (Sandbox Code Playgroud)
这种方式只能DT一次性运行.