Текущая сумма в столбце зависит от значения

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

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?


person Matt Weller    schedule 12.02.2012    source источник


Ответы (1)


Похоже, вам нужно кодирование длины прогона (с помощью команды 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 затем превращает этот список в вектор.

person Ari B. Friedman    schedule 12.02.2012
comment
Большое спасибо, это исправило это и дало мне возможность изучить дополнительные функции!! Отличный, оперативный ответ! - person Matt Weller; 13.02.2012
comment
Без проблем. Как оказалось, я как раз нашел применение именно этой функции :-). Также взгляните на семейство функций rollapply в библиотеке zoo, которые являются более мощными, но за счет фиксированного размера окна (может быть способ изменить его; я не очень знаком с ними). - person Ari B. Friedman; 13.02.2012
comment
P.S. Добро пожаловать в Stack Overflow! Мы надеемся, что вы будете придерживаться тега [r]. - person Ari B. Friedman; 13.02.2012