次の構造を持つ DF と呼ばれる非常に大きな (約 6m 行) データフレームがあります。
CodeContract RelMonth AmtPmt
A0001 10 0.00
A0001 11 15.00
A0002 12 4.55
A0003 4 0.00
... ... ...
RelMonth
に関連付けられた特定の静的イベントからの月数として定義されCodeContract
ます。
CodeContract
このデータは既におよび でソートされていRelMonth
ます。データ フレームは現在連続していRelMonth
ます。つまり、CodeContract
Minと MaxがRelMonth
あるCodeContract
場合、データ フレームには が含まれます。RelMonth=5
RelMonth=12
RelMonths 5:12
特定の aが a を持ってから何回経ったかMths_since_last_Pmt
をカウントするという別の列を計算したいと思います。CodeContract
RelMonths
CodeContract
AmtPmt > Amt_threshold
このように動作します(仮定Amt_threshold=5
)
CodeContract RelMonth AmtPmt Mths_since_last_Pmt
A0001 1 0.00 1
A0001 2 3.00 2
A0001 3 0.00 3
A0001 4 10.00 0
A0001 5 0.00 1
A0002 1 10.00 0
A0002 2 12.00 0
A0002 3 0.00 1
A0002 4 0.00 2
現在、ループを使用する実用的なソリューションがありFor
ますが、1 秒あたり約 5,000 行しか処理できません。
この計算をベクトル化する方法を探しています。最初にデータを並べ替えたり、途切れさせたりする必要はありませんRelMonths
。
私が開発しようとしたすべてのベクトル化されたソリューションは、通常ddply
その callseq_along
で、最終的に RAM (24GB) を使い果たします。2GB 未満の RAM 使用量で実行できるソリューションを探しています。たぶん、カスタム関数の形での解決策でしょうか?
これを機能させる方法はありますか?
更新@ローランド
@ローランド
以下のコードで誤った出力をもたらす、わずかに異なるデータセットを見つけました。微調整された入力は次のとおりです。
DF <- read.table(text="CodeContract RelMonth AmtPmt Mths_since_last_Pmt
A0001 1 0.00 1
A0001 2 3.00 2
A0001 3 0.00 3
A0001 4 10.00 0
A0001 5 0.00 1
A0002 1 1.00 0
A0002 2 14.00 0
A0002 3 14.00 1
A0002 4 14.00 2",header=TRUE)
対応する出力は次のとおりです。
CodeContract RelMonth AmtPmt Mths_since_last_Pmt Mths_since_last_Pmt2
1: A0001 1 0 1 1
2: A0001 2 3 2 2
3: A0001 3 0 3 3
4: A0001 4 10 0 0
5: A0001 5 0 1 1
6: A0002 1 1 0 1
7: A0002 2 14 0 0
8: A0002 3 14 1 -1
9: A0002 4 14 2 -2
最後の行の負の数-1
と-2
inは正しくありません。両方ともしきい値を超えているMths_since_last_Pmt2
はずです。0
最初の項目がサブグループ (ここではCodeContract
変更による) である場合、アルゴリズムは失敗するように思われますが、しきい値を下回っているだけで十分です。
これを機能させるために適用できる微調整はありますか?