在一个向量中,仅当负值前面是正值时,求出所有负值的总和。

4

我有一个向量,形式如下:

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])

但是我不确定如何只包含符合我的条件的负值。

(我有很多向量需要执行类似的操作,它们并不都具有相同的负/正值序列,因此我也不能通过将向量子集排除前三个值来处理此问题,因为要排除的值的数量取决于向量)。

非常感谢您的任何帮助!

3个回答

4
ones.you.want <- intersect(which(mass < 0), which(mass > 0)[1]:length(mass))
sum(mass[ones.you.want])

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

1

接下来是对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)

0
sum( mass[-1][ mass[-1] < 0 & mass[-length(mass)] > 0 ] )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接