如果已经问过这个问题,请提前道歉,我在网上搜索时找不到任何相关内容。
在
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 中执行此操作或者是否有解决方法?
这就是你想要做的吗?
dt[, {A = a * a; .(A, B = A * b)}]
A B
<num> <num>
1: 1 4
2: 4 20
3: 9 54