我是R的新手,并在以下累加乘法与额外常量的结合中苦苦挣扎。我希望在数据框中实现以下目标:
Variable_X Variable_Y Variable_Z
X1 Y1 Y1*X1 = Z1
X2 Y2 (Z1+Y2)*X2 = Z2
X3 Y3 (Z2+Y3)*X3 = Z3
X4 Y4 (Z3+Y4)*X4 = Z4
任何帮助将不胜感激。
答案 0 :(得分:2)
我相信一个好的老式for
循环是解决此问题的最佳方法。
dat <- data.frame(Variable_X = 1:10, Variable_Y = 11:20)
dat$Variable_Z <- dat$Variable_X[1]*dat$Variable_Y[1]
for(i in seq_len(nrow(dat))[-1]){
dat$Variable_Z[i] <- (dat$Variable_Z[i - 1] + dat$Variable_Y[i])*dat$Variable_X[i]
}
dat
# Variable_X Variable_Y Variable_Z
#1 1 11 11
#2 2 12 46
#3 3 13 177
#4 4 14 764
#5 5 15 3895
#6 6 16 23466
#7 7 17 164381
#8 8 18 1315192
#9 9 19 11836899
#10 10 20 118369190
答案 1 :(得分:2)
仅使用基数R定义一个匿名函数来体现迭代,然后使用Reduce
运行它:
transform(DF, Z = Reduce(f = function(prev, i) (prev + Y[i]) * X[i],
x = seq_along(X), init = 0, acc = TRUE)[-1])
给出(用于末尾注释中的输入):
X Y Z
1 1 101 101
2 2 102 406
3 3 203 1827
4 4 104 7724
gsubfn函数允许使用简短的形式表示函数定义,并使用它可以将上面的代码重写为:
library(gsubfn)
transform(DF, Z = fn$Reduce(f = prev + i ~ (prev + Y[i]) * X[i],
x = seq_along(X), init = 0, acc = TRUE)[-1])
我们使用了以下输入:
DF <- data.frame(X = 1:4, Y = 101:104)
答案 2 :(得分:2)
library(Rcpp)
cppFunction("NumericVector foo_cpp (NumericVector x, NumericVector y) {
int n = x.size(), i;
NumericVector z(n);
double tmp = 0.0;
for (i = 0; i < n; i++) {
tmp = (tmp + y[i]) * x[i];
z[i] = tmp;
}
return z;
}")
set.seed(0)
dat <- data.frame(x = runif(1e+6), y = runif(1e+6))
system.time(z <- foo_cpp(dat$x, dat$y))
# user system elapsed
# 0.016 0.000 0.014
dat$z <- z