【问题标题】:R: sum negative values in a vector only if they are preceded by positive valuesR:仅当向量中的负值前面有正值时才对它们求和
【发布时间】:2011-12-19 00:46:13
【问题描述】:

我有一个看起来像这样的向量:

mass<-c(-2, -6, -79, 31, -28, 198, 132, 0, 262, -187, -475, 701, 926)

我需要对该向量的以下值子集求和:

  • 所有正值;
  • 负值如果它们在向量中的前面是正值。

所以在上面的示例向量中,我想从总和中排除 -2、-6 和 -79(它们不遵循正值),但包括 -28、-187 和 -475(因为它们在向量中以正值开头)。

我可以总结。正值与

sum(mass[mass>0])

但我不确定如何仅包含那些符合我标准的负值。

(我有大量的向量需要执行类似的操作,而且它们的负/正值序列并不相同,所以我也不能只通过对向量进行子集来处理这个问题排除前三个值,因为要排除的值的数量会因向量而异)。

非常感谢您的帮助!

【问题讨论】:

    标签: r vector subset


    【解决方案1】:
    sum( mass[-1][ mass[-1] < 0 & mass[-length(mass)] > 0 ] )
    

    【讨论】:

      【解决方案2】:

      根据 Rguy 的说明,如果向量元素都是负数,这里有一个替代方法也可以:

      getElements <- function(X) {    
        id <- which(X > 0   |                   # +'s
                    c(FALSE, diff(sign(X))==-2) # - after +. (1st element always FALSE)
              )
        return(X[id])
      }
      
      getElements(mass)
      # [1]   31  -28  198  132  262 -187  701  926
      
      getElements(-1:-10)
      # integer(0)
      

      【讨论】:

        【解决方案3】:
        ones.you.want <- intersect(which(mass < 0), which(mass > 0)[1]:length(mass))
        sum(mass[ones.you.want])
        

        注意:如果向量中没有正值,这可能会失败。

        【讨论】:

          猜你喜欢
          • 2015-07-21
          • 2011-02-21
          • 2018-12-25
          • 1970-01-01
          • 2015-03-22
          • 1970-01-01
          • 1970-01-01
          • 2019-12-11
          • 1970-01-01
          相关资源
          最近更新 更多