I have a vector of binary variables which state whether a product is on promotion in the period. I\'m trying to work out how to calculate the duration of each promotion and
It sounds like you need run length encoding (via the rle
command in base R).
unlist(sapply(rle(promo.flag)$lengths,seq))
Gives you a vector 1 2 1 1 1 2 1 2 3 1 1 2 1
. Not sure what you're going for with the zero at the end, but I assume it's a terminal condition and easy to change after the fact.
This works because rle()
returns a list of two, one of which is named lengths
and contains a compact sequence of how many times each is repeated. Then seq
when fed a single integer gives you a sequence from 1 to that number. Then apply repeatedly calls seq
with the single numbers in rle()$lengths
, generating a list of the mini sequences. unlist
then turns that list into a vector.