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

标签 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]

最佳答案

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

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

关于r - 在 j 表达式中再次使用函数结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28198349/

相关文章:

r - 使用 dplyr 管道更改列值

r - 每天在 R 数据帧上应用 cut()

r - 基于不同的列子集和聚合原始数据表

r - 如何将第一列中的名称与重复行关联起来?

r - 如何连接多个不相关的数据集

r - 使用 `cut` 的 `dplyr::rowwise` 标签的错误行为?

r - 将相关矩阵绘制成图表

r - data.table 按连接表中的非 id 列分组

r - R 中按两列分组和级别并集

r - 在这个简单的情况下,如何将函数传递到 data.table 中的 j 中?