您好,我想知道是否有人知道/可以告诉我如何基于列ImageView.ScaleType(FIT_XY);
和另一列{{1}中的先前值来计算列C
中的值}并将计算的值另存为C
列中的新当前值?
例如,假设我首先将列D
初始化为C
s,而我要实现的计算是C
和1
。
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()
会这样做,因为乘法是分布式的。如果我想提供更复杂的自定义功能怎么办?
非常感谢!
答案 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