Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在j表达式中再次使用函数结果_R_Data.table - Fatal编程技术网

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

R 在j表达式中再次使用函数结果,r,data.table,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

如何在不计算两次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]
DT[x != "c",":="(
    V1 = sum(y),
    V2 = prod(y),
    V3 = V1 + V2
),by=x]
但是它不是很干净,而且i表达式需要再次求值

我想要的语法如下:

DT[x != "c",V3 := V1 + V2]
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]
DT[x!=“c”,c(“V1”、“V2”、“V3”):=

{V1那么您想要的输出应该包含
NA
x==c
值,还是应该删除这些行?x==c应该是未触及的。我通过在其中放置一些初始值来澄清这个问题。我会看看是否可以将其添加到。经常出现。谢谢!这正是我想要的。