创建R循环

时间:2018-11-06 00:00:16

标签: r loops

我正在尝试创建一个R循环以帮助我获取Var2,Var3和Var4(请参见下面的输出)。 Var1,Var5已预先输入。 Var4 1已预先输入。

 Var2 = lag(Var4) * Var5
 Var3 = Var2 + lag(Var3)
 Var4 = Var1 - Var3

有什么建议吗?

enter image description here

2 个答案:

答案 0 :(得分:2)

首先,我用初始值预先填充表格:

df <- data.frame(row = 1:5, 
                 Var1 = rep(500, 5),
                 Var2 = c(0, rep(NA_real_, 4)),
                 Var3 = c(0, rep(NA_real_, 4)),
                 Var4 = c(500, rep(NA_real_, 4)),
                 Var5 = 0.1)

然后,由于这是递归的,因此我重新运行此过程,并且每次它根据前一行的可用性再填充一行时。 (可能不是最优雅的,但可以!)

library(dplyr)
for(i in 2:nrow(df)) {
  df <- df %>%
    mutate(Var2 = if_else(row == 1,   0, lag(Var4) * Var5),
           Var3 = if_else(row == 1,   0, Var2 + lag(Var3)),
           Var4 = if_else(row == 1, 500, Var1 - Var3),
           Var5 = 0.1)
}

输出

> df
  row Var1  Var2   Var3   Var4 Var5
1   1  500  0.00   0.00 500.00  0.1
2   2  500 50.00  50.00 450.00  0.1
3   3  500 45.00  95.00 405.00  0.1
4   4  500 40.50 135.50 364.50  0.1
5   5  500 36.45 171.95 328.05  0.1

答案 1 :(得分:1)

基本的R解决方案。

我们用开始值预分配df

df <- data.frame(
    Var1 = rep(500, 5),
    Var2 = 0,
    Var3 = 0,
    Var4 = 500,
    Var5 = rep(0.1, 5)
)

我们注意到我们可以将递归关系重写为

Var4[i] = Var1[i] - Var4[i-1] * Var5[i] - Var3[i-1]
Var3[i] = Var4[i-1] * Var5[i] + Var3[i-1]
Var2[i] = Var4[i-1] * Var5[i]

然后我们可以在一个df循环中替换for中的值

for (i in 2:nrow(df)) {
    df$Var4[i] = df$Var1[i] - df$Var4[i-1] * df$Var5[i] - df$Var3[i-1]
    df$Var3[i] = df$Var4[i-1] * df$Var5[i] + df$Var3[i-1]
    df$Var2[i] = df$Var4[i-1] * df$Var5[i]
}
df
#  Var1  Var2   Var3   Var4 Var5
#1  500  0.00   0.00 500.00  0.1
#2  500 50.00  50.00 450.00  0.1
#3  500 45.00  95.00 405.00  0.1
#4  500 40.50 135.50 364.50  0.1
#5  500 36.45 171.95 328.05  0.1