【问题标题】:Summing Vector elements until a Positive element is encountered - R对向量元素求和,直到遇到正元素 - R
【发布时间】:2014-01-31 18:33:44
【问题描述】:

我是 R 新手,我正在浏览一本名为“使用 R 发现统计数据”的书。 虽然这本书暗示你不需要任何统计背景,但有些内容没有涵盖/解释......

我试图从位置 1 开始对向量的元素求和,直到出现正元素。

我发现this 问题与我想要实现的目标非常相似。但是,当我实现它时,它似乎并不总是有效(有时它似乎包含第一个积极元素)......

我的程序是:

  vecA <- runif(10, -10, 10);
  sumA <-sum(vecA [1:min(which(vecA < 0))]);

有没有更稳健的方法来计算这个而不使用每次都有效且不添加正元素的循环?我还没有进入我的书循环阶段。

我还发现this 网站提出了类似的问题,但他们的回答错误:

  sum(vecA [seq_len(which.max(vecA > 0)]);

【问题讨论】:

  • 你正在做的也许是最简单的方法。 cmets 中的答案很好,但过于复杂,很难理解一个简单的想法。
  • 如果第一个元素是正数(没有要求和的元素),你想要的输出是什么?
  • @BlueMagister 我认为它应该返回 0?无论如何,这似乎是合理的。

标签: r sum


【解决方案1】:

您可以使用以下代码:

sum(vecA * !cumsum(vecA > 0))

如果第一个元素是正数或所有元素都是负数,这也适用。

【讨论】:

  • 啊。谢谢太好了。我以前没见过cumsum() 函数。感谢发帖。
  • 这是一个很好的答案,供您使用!我的朋友
【解决方案2】:

您想使用 > 而不是

您目前从 1 求和,直到达到第一个负值(包括第一个负值)。

sum(vecA[1:min(which(vecA>0))-1])

which() 函数将返回正元素的所有位置,然后将总和从 1 到第一个正元素的位置 - 1 将保证您对所有负元素求和

【讨论】:

  • 哦!愚蠢的错误。现在说得通了。感谢您抽出宝贵的时间发帖。很好的答案。 :)
  • 如果所有元素都像下面的答案一样,这是否也有效?
  • @Reanimation 不,如果所有元素都是负数,它就不起作用。
  • 啊,没关系。当我尝试它时,我只是在检查我没有在 R 中做一些愚蠢的事情。谢谢。
【解决方案3】:

match 函数通常是在向量中找到第一次出现的某个元素的最快方法,因此它的另一个版本可能如下所示:

first.positive <- match(TRUE, vecA > 0)
sumA <- sum( vecA[ 1 : first.positive ] ) - vecA[first.positive]

如果正元素是第一个,这将给你零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2018-11-30
    • 1970-01-01
    相关资源
    最近更新 更多