【发布时间】:2026-01-14 04:50:01
【问题描述】:
我想在 for 循环中更新 data.table 中的某些列。列名是动态设置的。不幸的是,我使用的解决方案非常慢,因此不可行。我已经尝试了我在这个主题上找到的所有东西,但似乎没有什么能让它变得更快。
我的数据集有 682446 行。似乎让它如此缓慢的是动态列名。当我使用静态版本时,它工作得非常好,而且速度很快:
dt[education>0, educationNewVersion:=education]
当i,j(LHS,RHS)中的变量名是动态的时候就会出现问题:
varName = 'education'
newVarName <- paste0(varName, 'NewVersion')
# This is much slower as the static version from above, takes almost half a minute.
dt[dt[[varName]]>0, (newVarName):=get(varName)]
# This is very slow too
dt[dt[[varName]]>0, (newVarName):=eval(varName)]
# This one throws an error (see below)
dt[dt[[varName]]>0, (newVarName):=dt[[varName]]]
这是第三个表达式抛出的错误: “提供了 682446 项分配给列 'gerSpeakImp' 的 76451 项。如果您希望 '回收' RHS,请使用 rep() 向您的代码读者明确这一意图。”
请不要建议我使用 set()。 set() 不支持分组,我需要分组(我只是没有在此处包含以保持示例简单)。我不知道还能做什么。目前,我正在使用自己的语句更新每一列,这确实是非常多余的,当我从 Stata 迁移到 R(和 data.table)时,这不是我所期望的。
【问题讨论】:
-
你试过
.SDcols即dt[, (newVarName) := .SD[[1]], .SDcols = varName]
标签: r data.table