创建一列并引用它以在data.table中同时创建另一列

问题描述 投票:0回答:1

如果已经问过这个问题,请提前道歉,我在网上搜索时找不到任何相关内容。

dplyr
中,可以使用
mutate
创建列,并在同一
mutate
语句中使用新构造的列创建另一列。例如(请注意,这可能不是最好的例子,但我只是想说明问题)

df = data.frame(a = c(1,2,3), 
                b = c(4,5,6))

df %>% 
  dplyr::mutate(A = a * a, 
                B = A * b)

退货

  a b A  B
1 1 4 1  4
2 2 5 4 20
3 3 6 9 54

在这里,我们看到列

A
已被构造,然后在
B
的定义中同时使用,所有这些都在同一个
mutate
语句中。

但是,当尝试在

data.table
中执行相同操作时,它不起作用,如下所示

dt = data.table(df)

dt[, `:=` (A = a * a, 
           B = A * b)]

Error in eval(jsub, SDenv, parent.frame()) : object 'A' not found

并在

get(A)
的定义中调用
B
表明问题就在那里。看来这些柱子需要分成单独的部分建造,即
dt[, A := a * a][, B := A * b]
。这似乎也是 vignette 描述它的方式(第 3a 节,
speed
max_speed
列的构造)。

这样做的问题是,当处理大量行和组时,如果列是按组构建的,则对组进行两次调用或执行两次相同的操作是低效的

dt[, A := a * a, by = "group"][, B := A * b, by = "group"] # two group calls
dt[, `:=` (A := a * a, B = a * a * b), by = "group"]       # two a * a calls

所以,我想知道是否可以在 data.table 中执行此操作或者是否有解决方法?

r data.table
1个回答
0
投票

这就是你想要做的吗?

dt[, {A = a * a; .(A, B = A * b)}]

       A     B
   <num> <num>
1:     1     4
2:     4    20
3:     9    54
© www.soinside.com 2019 - 2024. All rights reserved.