2012-02-12 36 views
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

我试着玩应用功能和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

这听起来像你需要运行长度编码(通过基地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将该列表变成矢量。

+0

非常感谢,这是固定的,并给我更多的功能学习! 优秀,及时的回应! – 2012-02-13 01:13:02

+0

没问题。事实证明,我只是发现了这个功能的用途:-)。还可以看看'zoo'库中的'rollapply'函数家族,它们功能更强大,但是以固定窗口大小为代价(可能有一种方法可以改变它;我对它们不是很熟悉)。 – 2012-02-13 01:25:21

+0

P.S.欢迎来到堆栈溢出!我们希望你会坚持[r]标签。 – 2012-02-13 01:26:44