【问题标题】:Finding value of a series in R without for-loop在没有for循环的情况下在R中查找系列的值
【发布时间】:2021-07-12 16:06:54
【问题描述】:

我是 R` 的新手,我发现了这个问题:

使用 R 计算以下总和: 1+(2/3)+(2/3)(4/5)+...+(2/3)(4/5)...(38/39)

我很想知道如何在不使用 for 循环 并且只使用 vector 操作的情况下解决这个问题。


我的想法和我到目前为止所尝试的:

假设我创建了两个向量,例如

x<-2*(1:19)
y<-2*(1:19)+1

然后,x 包含问题中的所有分子,y 包含所有分母。现在

z<-x/y

将创建一个长度为19 的向量,其中将存储2/34/5、...、38/39 的值

我正在考虑使用 R 中的 prod 函数来查找所需的产品。所以,我创建了一个这样的向量

i<-1:19

为了从第一个元素到最后一个元素遍历z,我确实写了:

prod(z[1:i])

但它惨败,给了我结果:

[1] 0.6666667
Warning message:
In 1:i : numerical expression has 19 elements: only the first used

我想做的事:

我希望将(2/3), (2/3)(4/5), ..., (2/3)(4/5)...(38/39) 的值单独存储在另一个向量中(例如p),因此其中将包含19 元素。然后我打算使用sum 函数来最终找出所有这些的总和......


我卡在哪里了:

R documentation 中所述,prod 函数返回其参数中存在的所有值的乘积。所以,

prod(z[1:1])
prod(z[1:2])
prod(z[1:3])

将分别返回 (2/3), (2/3)(4/5), (2/3)(4/5)(6/7) 的值:

> prod(z[1:1])
[1] 0.6666667
> prod(z[1:2])
[1] 0.5333333
> prod(z[1:3])
[1] 0.4571429

但不可能像这样继续对向量z 的所有19 元素执行此操作。我被困在这里思考可以做什么。我想逐个迭代z 的所有元素,我为此创建了另一个向量i,如上所述,但它并没有像我想象的那样进行。对于如何做到这一点,任何帮助、建议和提示都会非常有用。我的想法似乎已经用完了。


更多信息:

在这里,我以系统的方式提供所有输出,以便其他人更好地理解我的问题:

> x
 [1]  2  4  6  8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38
> y
 [1]  3  5  7  9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
> z
 [1] 0.6666667 0.8000000 0.8571429 0.8888889 0.9090909 0.9230769 0.9333333
 [8] 0.9411765 0.9473684 0.9523810 0.9565217 0.9600000 0.9629630 0.9655172
[15] 0.9677419 0.9696970 0.9714286 0.9729730 0.9743590
> i
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19

简短说明(前面有争议的声明):这篇文章确实受益于 LaTeX 的使用,但不幸的是,由于极其严重的依赖关系,就像现在一样在几篇关于在 Stack Overflow 中包含 LaTeX 的帖子中提到(如 this),直到现在还没有发生。

【问题讨论】:

    标签: r vector


    【解决方案1】:

    您可以使用cumprod 来获得您所追求的向量的累积乘积

    p <- cumprod(z)
    p
    # [1] 0.6666667 0.5333333 0.4571429 0.4063492 0.3694084 0.3409923 0.3182595
    # [8] 0.2995384 0.2837732 0.2702602 0.2585097 0.2481694 0.2389779 0.2307373
    # [15] 0.2232941 0.2165276 0.2103411 0.2046562 0.1994087
    

    cumprod 的一个效率较低但更通用的替代方案是

    p <- sapply(i, function(x) prod(z[1:x]))
    

    这里sapply 代替循环并为每个产品传递不同的结束索引

    那你就可以了

    1 + sum(p)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 2018-11-02
      • 1970-01-01
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多