【问题标题】:Reducing rolling product data.table减少滚动产品data.table
【发布时间】:2021-11-29 22:52:07
【问题描述】:

我想使用data.table 在我的小组中获得一个减少滚动产品。也就是说,下面数据集tst 中的第一行将是组 A 中所有 4 个值观察值和 orderVal(1:4) 的乘积。第二个是 orderVal 2:4,第三个是 3:4,最后一个是 4:4,以此类推所有 k 组。我可以使用 for 循环来做到这一点,但我知道这可能只使用 data.table 可以做得更干净、更有效。

下面的可重现代码:

require(data.table)

tst <- data.table(grp = c(rep("A", 4), rep("B",4)),
                  orderVal = c(rep(seq(1,4),2)),
                  val = c(rep(1.4, 4), rep(1.5, 4)))

【问题讨论】:

    标签: r data.table rolling-computation


    【解决方案1】:

    您可以使用Reduce,带有accumulate=TRUE 选项:

    tst[order(grp,-orderVal),prod:=Reduce(`*`,val,accumulate=T),by=grp][]
    
       grp orderVal val   prod
    1:   A        1 1.4 3.8416
    2:   A        2 1.4 2.7440
    3:   A        3 1.4 1.9600
    4:   A        4 1.4 1.4000
    5:   B        1 1.5 5.0625
    6:   B        2 1.5 3.3750
    7:   B        3 1.5 2.2500
    8:   B        4 1.5 1.5000
    

    【讨论】:

    • 谢谢——这几乎就是我想要的,只是倒过来了。我可能还不够清楚,我想以另一种方式获得产品。即 orderval 1 和 grp A 应该是 prod = 3.8416,orderVal 2 应该是 prod = 2.7440,依此类推。所以它应该从最高到最低(在这种情况下)
    • 谢谢,我没有正确阅读您的帖子。查看我的编辑
    • 验证后进一步简化。
    猜你喜欢
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多