在以值为条件的列上运行总和

标签 r vector apply cumulative-sum

我有一个二元变量向量,它说明产品在这段时间内是否正在促销。我正在尝试弄清楚如何计算每次促销的持续时间以及两次促销之间的持续时间。

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/

相关文章:

基于字符向量重新排序数据框

python - 在 Pandas 中使用 Groupby : assign a value from a column conditioned on another column

r - 如何使用 geom_point {ggplot2} 获取条形末端的点而不在图例中获取圆圈?

r - 如何在 R 中为条件逻辑回归匹配患者数据?

r - ggimage:来自计算机而非网络的自定义图像

c++ - 用平面内存结构替换 vector 的 vector

c++ - 在 C++ 中从 vector 中弹出一个特定元素

将与另一个 data.frame 中的行名匹配的列中的值替换为关联值

python - pandas 在列的子集上应用自定义函数

r - 应用返回奇怪的结果