Создание R Loop - PullRequest
       3

Создание R Loop

0 голосов
/ 06 ноября 2018

Я пытаюсь создать цикл 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 голосов
/ 06 ноября 2018

Базовый раствор 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
0 голосов
/ 06 ноября 2018

Сначала я предварительно заполняю таблицу начальными значениями:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...