【问题标题】:Create Vector Sequence Based off of Initial Variables and Function根据初始变量和函数创建向量序列
【发布时间】:2016-03-19 23:23:06
【问题描述】:

我是 R 新手,我需要帮助在 R 中使用初始起始元素创建向量序列,并根据前一个向量元素计算向量序列中的下一个下一个元素。

这就是我想要做的。向量的第一个元素 (z) 将被定义为:

z = (X * Y) + X

所以如果 X = 100,Y = 0.14,那么 Z = 114。

然后我想取那个新的 z 并在我们计算的时间内将其称为 x。然后循环重复,y 保持不变,114 成为新的 x 值。

所以 Z =(114, 129.96, 148.15, ...) 等等。

我曾认为seq()rollapply() 的某种组合会起作用,但我还没有弄清楚。我正在处理数据框,这只是我尝试执行的更复杂计算的一小部分。

任何帮助将不胜感激。

谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    如果你想变得酷、不循环、更通用:

    value = 114
    nout <- 10
    y <- .14
    v <- Reduce(function(v, x) y*v +v, x=numeric(nout),  init=value, accumulate=TRUE)
    [1] 114.0000 129.9600 148.1544 168.8960 192.5415 
    [6] 219.4973 250.2269 285.2586 325.1949 370.7221
    

    但考虑到您的用例,for 循环也可以正常工作,并且更多可读:

    X <- 100
    Y <- .14
    z <- rep(NA, 10)
    z[1] <- (X * Y) + X
    for(i in 2:length(z)){
      z[i] <- (z[i-1] * y) + z[i-1]
    }
    
    z
    [1] 114.0000 129.9600 148.1544 168.8960 192.5415 
    [6] 219.4973 250.2269 285.2586 325.1949 370.7221
    

    【讨论】:

    • 完美,这个更通用的解决方案将对我正在处理的其他一些事情有很大帮助
    • @SerbanTanasa 我会开始储备各种糖果以备将来使用
    【解决方案2】:

    让我们做一个小数学:

    z = x * y + x 
      = x * (y + 1)
    

    所以你的顺序是

    x,
    x * (y + 1), 
    x * (y + 1) * (y + 1), ...
    

    也就是说

    z_i = x * (y + 1) ^ (i - 1)
    

    由于 R 中的所有算术运算都是矢量化的,包括^,所以代码很简单:

    x = 100
    y = 0.14
    x * (y + 1) ^ (0:10)
    # [1] 100.0000 114.0000 129.9600 148.1544 168.8960 192.5415 219.4973 250.2269 285.2586
    # [10] 325.1949 370.7221
    

    不需要循环或花哨的功能。您可以将我的代码中的10 替换为您想要的任意多次迭代。

    【讨论】:

    • 我给你的是简约的,但我的更通用。
    • 谢谢,我应该像你一样把它分解。我有一个坏习惯,试图为每个场景找到“完美”的功能
    【解决方案3】:

    你可以写一个 for 循环:

    # Starting values
    x <- 100 + 14
    y <- .14
    z <- 114
    
    
    # For loop with 100 iterations:
    for(i in 2:100) {
      z[i] <- (x * y) + x
      x <- z[i]
    }
    

    所有计算值都将存储在 z 中。

    【讨论】:

    • 感谢您的建议,已修复
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    相关资源
    最近更新 更多