【发布时间】:2020-10-20 08:53:41
【问题描述】:
考虑这两个 dt 和一个包含某些列名称的向量
mtcars=data.table(mtcars)
mydt=mtcars
mydt$disp=10
i=1
names(mtcars)
[1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear" [11] "carb"
myVector <- c('disp', 'hp', 'wt')
我经常需要处理具有数千列的 data.table,并且必须对列的子集或一列执行不同的计算,但我仍然对 .. 和 with=FALSE 的使用感到困惑。
例如索引向量时好像不能使用..,比如
mtcars[,..myVector[i]]
[1] "disp"
但只有这样才有效
mtcars[,myVector[i],with=FALSE]
现在,如果我想用 mydt 中存储的值更新 mtcars 中的值,我找不到访问该列中值的方法。通常列表中的 [[]] 返回向量 这些都不行
mtcars[,myVector[i],with=FALSE]=mydt[,myVector[i],with=FALSE]
mtcars[,myVector[i],with=FALSE := mydt[,myVector[i],with=FALSE]]
mydt[[,myVector[i],with=TRUE]]
如果我想将这些值从一个 data.table 复制到另一个,正确的语法是什么?只复制值而不是 data.table 的语法是什么,与使用 mydt$disp 得到的基本相同?
编辑:似乎这种语法有效,但我仍然不明白为什么左侧不需要 .. 或 with=FALSE。
mtcars[,myVector[i]]=mydt[,myVector[i],with=FALSE]
mtcars[,myVector]=mydt[,myVector,with=FALSE]
【问题讨论】:
-
您只想替换整个变量的值,而不是连接?如果是这样,我想我只会
mtcars[, (myVector[i]) := mydt[[myVector[i]]]]。不确定with = FALSE的扩展用途是什么。不记得上次用是什么时候了。对于带有for循环的多列set应该可以工作。 -
@DavidArenburg,不,这不是加入。
-
我不知道细节,但您的工作流程可能不是最理想的。
-
with = FALSE复制整个 data.table 所以不建议。..与with = FALSE相同,只是更漂亮 - 所以两者都不建议(它也无法评估表达式,这就是..myVector[i]不起作用的原因)。使用:=和[[,就像我在第一条评论中展示的那样。get/mget也是过度杀戮,可能导致内存问题。 -
因为
..不能计算表达式,我已经告诉过你了。它们在某种意义上是相同的,当..可能默认为with = FALSE时,它就不起作用。如果你不相信我,check the code yourself
标签: r data.table