Промежуточная сумма по столбцу, условная по значению - PullRequest
3 голосов
/ 12 февраля 2012

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

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?

1 Ответ

4 голосов
/ 12 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...