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

我尝试过使用 apply 函数和 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

1 回答 1

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然后将该列表转换为向量。

于 2012-02-12T14:09:31.797 回答