Применение cumsum к двоичному вектору

У меня есть простой двоичный вектор a, который я пытаюсь преобразовать в вектор b с помощью R-функции cumsum. Однако cumsum не возвращает точно вектор b.

Вот пример:

a <- c(1,0,0,0,1,1,1,1,0,0,1,0,0,0,1,1)

b <- c(1,2,2,2,3,4,5,6,7,7,8,9,9,9,10,11)

> cumsum(a)
[1] 1 1 1 1 2 3 4 5 5 5 6 6 6 6 7 8

Проблема в том, что всякий раз, когда в векторе a появляется 0, предыдущее число должно быть увеличено на 1, но только для первого 0. Остальным присваивается одно и то же значение.

Любой совет был бы замечательным! :-)


person user969113    schedule 18.07.2012    source источник


Ответы (1)


Хитрость заключается в использовании diff для обозначения переходов:

cumsum(as.logical(a+c(0,abs(diff(a)))))
 [1]  1  2  2  2  3  4  5  6  7  7  8  9  9  9 10 11
person James    schedule 18.07.2012
comment
не уверен, что зашел бы так далеко ;p, но большое спасибо за этот замечательный код! :-) - person user969113; 18.07.2012