使用if语句

时间:2016-08-15 14:34:46

标签: r apply nested-loops

Here is the image showing what i need to calculate。对不起,图片中的total_r实际上是代码中的test_gain,而pic中的gamma是指代码中的alpha(对不起)。同样在图像中我停止在t = 3计算,但实际上我想计算它直到最后一个值为0.6。

我很擅长使用apply系列函数。我通常使用循环,但我听说使用apply函数而不是嵌套for循环要快得多。我尝试了几个教程,但仍然无法用apply函数替换我的嵌套for循环。任何帮助将不胜感激,下面是我试图改变的代码。

基本上这就是我要做的事情: 数据的第一行:从列的列+ alpha * nextvalue获取值(第2行)+ alpha ^ 2 * column(row3)的nextvalue + alpha ^ 3 * column(row4)的下一个值,依此类推最后一排。每次我增加Alpha的力量。

所有这些计算都是第一行。现在对于第二行,我将忽略列中的第一个值,但将以相同的方式获取所有后续值。下面是我的代码,它的工作正常,但执行时间太长。

#value of alpha
alpha <- 0.85

# test_gain is a vector containing values from a column belonging to a data frame
test_gain <- testdata$Total_rew

# initialise the variables 
s = 0
d = rep(0,nrow(testdata))

for (i in 1:nrow(testdata[1:4999,])){
  d[i] = test_gain[i]
  for (s in (i+1):nrow(testdata)){
    d[i] = d[i] + alpha^(s-i) * test_gain[s]
    if (alpha^(s-i) < (10^-5)) {next()}

  }
}

1 个答案:

答案 0 :(得分:0)

关键是生成N幂级数alpha的大小为N的上三角矩阵,其中testdata1 alpha alpha^2 alpha^3 ... alpha^(N-1) 0 1 alpha alpha^2 ... alpha^(N-2) 0 0 1 alpha ... alpha^(N-3) 0 0 0 1 ... alpha^(N-4) ... ... 0 0 0 0 1 中看起来像testdata$Total_rew的行数这样:

## This will work for both nrow(testdata) is odd and even
nr <- ceiling(nrow(testdata)/2 - 1)
mat <- outer(alpha^(-nr:nr), alpha^(-nr:nr))
## reverse the columns
mat <- mat[,rev(seq.int(ncol(mat)))]
## what we want is in the lower triangular, so set the upper triangular to zeroes
mat[upper.tri(mat)] <- 0
## take the transpose so what we want is now upper triangular
mat <- t(mat)

然后,计算只是一个矩阵乘以d <- mat %*% testdata$Total_rew 列。

生成此上三角矩阵(改编自this SO question/answer):

mat

然后,

mat

另请注意,您无需在上一步中转置d <- testdata$Total_rew %*% mat 。如果您在上一步中转置To complete the registration process, click the http://xxx/#/confirmation?confirmationCode=OGM0Njg2ODktOTY0Ni00ZDViLTkzYWUtYjQzYzllMjY3NjMw ,则也会得到相同的结果:

To complete the registration process, click the http://xxx/#/confirmation?confirmationCode&#x3D;OGM0Njg2ODktOTY0Ni00ZDViLTkzYWUtYjQzYzllMjY3NjMw

希望这有帮助。