【问题标题】:Accessing and update one data.table column using vectors使用向量访问和更新一个 data.table 列
【发布时间】: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


【解决方案1】:

这是一个简单的选项:

library(data.table)
mtcars=data.table(mtcars)
mydt=copy(mtcars) #copy is important here
mydt[, disp := 10]

i=1
myVector <- c('disp', 'hp', 'wt')

mtcars[, (myVector[i]) := mydt[, get(myVector[i])]]
 #    mpg cyl disp  hp drat    wt  qsec vs am gear carb
 #1: 21.0   6   10 110 3.90 2.620 16.46  0  1    4    4
 #2: 21.0   6   10 110 3.90 2.875 17.02  0  1    4    4

:= 的 LHS 上使用 (...) 可确保评估。 get 应该是不言自明的。对于多个列,您可以使用mget

【讨论】:

  • 谢谢你的例子,请看我的编辑,我可以通过使用 mtcars[,myVector[i]]=mydt[,myVector[i],with=FALSE] mtcars[,myVector ]=mydt[,myVector,with=FALSE]。所以 get 产生的结果与使用 with=FALSE 相同吗?这有点令人困惑。
  • 我相信这种方法不能通过引用起作用,因此效率低下。不过,我还没有检查。一般在使用data.table时要避免[&lt;-$&lt;-
猜你喜欢
  • 2013-02-07
  • 1970-01-01
  • 2021-12-19
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
相关资源
最近更新 更多