在j表达式中再次使用函数结果

时间:2015-01-28 17:16:06

标签: r data.table

如何在不计算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-expression。

我想要的语法是这样的:

DT[x != "c",":="(
    V1 = sum(y),
    V2 = prod(y),
    V3 = V1 + V2
),by=x]

1 个答案:

答案 0 :(得分:9)

您可以使用{ .. }来定义表达式并在返回结果之前存储中间变量:

DT[x != "c", c("V1","V2","V3") := 
     {  V1 <- sum(y) 
        V2 <- prod(y)        
        V3 <- V1 + V2    
        list(V1,V2,V3)},by=x]