我有一个二进制变量向量,用于说明产品是否在此期间进行促销。我正在尝试计算如何计算每次促销的持续时间以及促销之间的持续时间。
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中实现这一目标吗?
答案 0 :(得分:4)
听起来你需要运行长度编码(通过基础R中的rle
命令)。
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
然后将该列表转换为矢量。