3

製品がその期間に販売促進されているかどうかを示すバイナリ変数のベクトルがあります。各プロモーションの期間とプロモーション間の期間を計算する方法を見つけようとしています。

promo.flag = c(1,1,0,1,0,0,1,1,1,0,1,1,0))

つまり、promo.flag前の期間と同じ場合はrunning.total + 1、それ以外の場合はrunning.total1にリセットされます。

適用関数と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()のは、2つのリストが返され、そのうちの1つに名前が付けられlengths、それぞれが繰り返される回数のコンパクトなシーケンスが含まれているためです。次にseq、単一の整数が供給されると、1からその数までのシーケンスが得られます。seq次に、の単一の番号を使用して繰り返し呼び出しを適用rle()$lengthsし、ミニシーケンスのリストを生成します。 unlist次に、そのリストをベクトルに変換します。

于 2012-02-12T14:09:31.797 に答える