2012-02-12 3 views
3

У меня есть вектор двоичных переменных, в которых указано, является ли товар продвигаемым в период. Я пытаюсь выяснить, как рассчитать продолжительность каждой акции и продолжительность между рекламными акциями.Текущая сумма на столбце, соответствующем значению

promo.flag = c(1,1,0,1,0,0,1,1,1,0,1,1,0)) 

Итак, другими словами: если promo.flag такой же, как предыдущий период то running.total + 1, иначе running.total сбрасывается на 1

Я пытался играть с применять функции и cumsum, но не удается получить условный сброс работает всего рабочих :-(

Выход мне нужно:

promo.flag = c(1,1,0,1,0,0,1,1,1,0,1,1,0) 
rolling.sum = c(1,2,1,1,1,2,1,2,3,1,1,2,0) 

Может кто-нибудь пролить свет на то, как достичь этого в R?

ответ

4

Похоже, вам нужно кодирование длины пробега (через команду rle в базе R).

unlist(sapply(rle(promo.flag)$lengths,seq)) 

Предоставляет вам вектор 1 2 1 1 1 2 1 2 3 1 1 2 1. Не уверен, что вы собираетесь с нулем в конце, но я предполагаю, что это терминальное условие и легко изменить после факта.

Это работает, потому что rle() возвращает список из двух, один из которых имеет имя lengths и содержит компактную последовательность из того, сколько раз каждый повторяется. Затем seq, когда подается одно целое число, дает вам последовательность от 1 до этого числа. Затем повторно применяйте вызовы seq с одиночными номерами в rle()$lengths, генерируя список мини-последовательностей. unlist затем превращает этот список в вектор.

+0

Большое спасибо, это исправлено и дано мне дополнительные функции для изучения! Отличный, быстрый ответ! –

+0

Нет проблем. Как оказалось, я просто нашел применение для этой самой функции :-). Также взгляните на семейство функций 'rollapply' в библиотеке' zoo', которые являются более мощными, но по цене фиксированного размера окна (возможно, есть способ его изменить, я не очень хорошо знаком с ними). –

+0

P.S. Добро пожаловать в переполнение стека! Мы надеемся, что вы будете придерживаться тега [r]. –