我可以在r中使用data.table对列进行即时计算吗?

时间:2018-07-06 19:43:58

标签: r data.table cumulative-sum rolling-computation

您好,我想知道是否有人知道/可以告诉我如何基于列ImageView.ScaleType(FIT_XY); 和另一列{{1}中的先前值来计算列C中的值}并将计算的值另存为C列中的新当前值?

例如,假设我首先将列D初始化为C s,而我要实现的计算是C1

C(1) = 1 + B(1)*0.1*1

我想要的是:

C(2) = C(1) + B(2)*0.1*C(1)

我可以使用test=data.table(A=1:5,B=c(1,2,1,2,1),C=1) test A B C 1: 1 1 1 2: 2 2 1 3: 3 1 1 4: 4 2 1 5: 5 1 1 test A B C 1: 1 1 1.1 2: 2 2 1.32 3: 3 1 1.452 4: 4 2 1.7424 5: 5 1 1.91664 来实现自己想要的功能,但我真的想知道仅使用for loop是否可行并加快速度。

编辑:

如弗兰克在下面的评论中所指出的,

apply()

会这样做,因为乘法是分布式的。如果我想提供更复杂的自定义功能怎么办?

非常感谢!

3 个答案:

答案 0 :(得分:3)

使用所提供的公式,我们将得到:

case 1:

当然,正如已经指出的那样,在这种特殊情况下它可以简化,因为我们可以将函数的主体写为test[, C := Reduce(function(c, b) c + .1 * b * c, B, init = 1, acc = TRUE)[-1] ] ,这意味着括号部分的累加积。

答案 1 :(得分:1)

似乎您需要累计应用该功能

library(data.table)
library(zoo)

test=data.table(A=1:5,B=c(1,2,1,2,1),C=1)

z <- function(b){1+b*0.1}

test[,C:=cumprod(rollapply(B, width=1, FUN=z))]

但我同意,实际上没有必要将动物园带到这里。弗兰克的解决方案更加优雅简洁。

test[,C:=cumprod(1 + .1*B)]

答案 2 :(得分:1)

我不相信有类似的ObjBase.h函数,但是您似乎想要data.table中的accumulate。下面是一个简单的示例,但是输入也可以是data.table的行。

purrr