在 j 表达式中再次使用函数结果
Using function result again in j expression
如何在不计算 sum 和 prod 函数的情况下执行此操作?
require(data.table)
DT = data.table(x=rep(c("a","b","c"),each=4), y=1:6, V1 = 1000L, V2 = 2000, V3 = 1)
DT[x != "c",":="(
V1 = sum(y),
V2 = prod(y),
V3 = sum(y) + prod(y)
),by=x]
当然我可以放弃V3计算然后继续这样:
DT[x != "c",V3 := V1 + V2]
但它不是很干净,而且 i 表达式需要再次计算。
我想要的语法是这样的:
DT[x != "c",":="(
V1 = sum(y),
V2 = prod(y),
V3 = V1 + V2
),by=x]
您可以使用 {
..}
来定义表达式并在返回结果之前存储中间变量:
DT[x != "c", c("V1","V2","V3") :=
{ V1 <- sum(y)
V2 <- prod(y)
V3 <- V1 + V2
list(V1,V2,V3)},by=x]
如何在不计算 sum 和 prod 函数的情况下执行此操作?
require(data.table)
DT = data.table(x=rep(c("a","b","c"),each=4), y=1:6, V1 = 1000L, V2 = 2000, V3 = 1)
DT[x != "c",":="(
V1 = sum(y),
V2 = prod(y),
V3 = sum(y) + prod(y)
),by=x]
当然我可以放弃V3计算然后继续这样:
DT[x != "c",V3 := V1 + V2]
但它不是很干净,而且 i 表达式需要再次计算。
我想要的语法是这样的:
DT[x != "c",":="(
V1 = sum(y),
V2 = prod(y),
V3 = V1 + V2
),by=x]
您可以使用 {
..}
来定义表达式并在返回结果之前存储中间变量:
DT[x != "c", c("V1","V2","V3") :=
{ V1 <- sum(y)
V2 <- prod(y)
V3 <- V1 + V2
list(V1,V2,V3)},by=x]