我有一个二元变量向量,它说明产品在这段时间内是否正在促销。我正在尝试弄清楚如何计算每次促销的持续时间以及两次促销之间的持续时间。
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 中实现这一点?
最佳答案
听起来您需要运行长度编码(通过 base 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 到该数字的序列。然后使用 rle()$lengths
中的单个数字重复调用 seq
,生成迷你序列列表。 unlist
然后将该列表转换为向量。
关于在以值为条件的列上运行总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9249338/