R: суммировать отрицательные значения в векторе, только если им предшествуют положительные значения - PullRequest
4 голосов
/ 01 ноября 2011

У меня есть вектор, который выглядит следующим образом:

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 голосов
/ 01 ноября 2011
ones.you.want <- intersect(which(mass < 0), which(mass > 0)[1]:length(mass))
sum(mass[ones.you.want])

Примечание: может произойти сбой, если в векторе нет положительных значений.

1 голос
/ 01 ноября 2011

Следуя примечанию Ргуи, вот альтернатива, которая также работает, если все элементы вектора отрицательны:

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 голосов
/ 01 ноября 2011
sum( mass[-1][ mass[-1] < 0 & mass[-length(mass)] > 0 ] )
...