【问题标题】:Creating R Loop创建 R 循环
【发布时间】:2018-11-06 00:00:15
【问题描述】:

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

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

有什么建议吗?

【问题讨论】:

  • 多少次?只有五次?
  • 一直到var4的长度
  • Var2 的值似乎与 lag(Var4) * Var5 不一致。能复查吗?此外,Var3 值由递归关系给出。在这种情况下,您需要一个起始值。这个起始值是多少?您声明要计算 Var4 的值,但后来提到 Var4 是“预先输入的”。那么它是哪一个?
  • @ali.hash2 这仍然不起作用。 500 作为Var3 的起始值不会给出屏幕截图中的Var3 值。此外,您还没有澄清Var4。 Var4 是给定的(“预输入”)还是您要计算 Var4?在后者的情况下,你有一个循环条件,因为Var2 依赖于Var4,Var2 依赖于Var3,而Var3 又依赖于Var4。
  • 如果您要查看如何提供minimal reproducible example/attempt,这将有助于很多。您的数据的屏幕截图不是一个好主意,因为它 (1) 需要我们手动转录您的数据,以及 (2) 不清楚您希望根据哪些其他数量/列生成哪些数量/列(什么是输入,输出是什么?)。

标签: r loops


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    基础 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]
    

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-28
      相关资源
      最近更新 更多