R:仅当向量中的负值前面为正值时才对它们求和

时间:2011-10-31 20:00:58

标签: r vector subset

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

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 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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)

答案 2 :(得分:0)

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