私は、ユーザーの特定のタイプのトランザクションを表す不規則な時系列データを持っています。各データ行はタイムスタンプを付けられ、その時点でのトランザクションを表します。データの不規則な性質によって、あるユーザは1日に100行を持ち、他のユーザは1日に0または1トランザクションを持つことがあります。dplyr:ローリング時間ウィンドウを使用したデータのグループ化と要約/変更
data.frame(
id = c(1, 1, 1, 1, 1, 2, 2, 3, 4),
date = c("2015-01-01",
"2015-01-01",
"2015-01-05",
"2015-01-25",
"2015-02-15",
"2015-05-05",
"2015-01-01",
"2015-08-01",
"2015-01-01"),
n_widgets = c(1,2,3,4,4,5,2,4,5)
)
id date n_widgets
1 1 2015-01-01 1
2 1 2015-01-01 2
3 1 2015-01-05 3
4 1 2015-01-25 4
5 1 2015-02-15 4
6 2 2015-05-05 5
7 2 2015-01-01 2
8 3 2015-08-01 4
9 4 2015-01-01 5
多くの場合、私は、ユーザーに関するいくつかのローリング統計情報を知りたい:
データは次のようになります。例えば:ある日のこのユーザについて、過去30日間に何回取引が行われたか、過去30日間に売られたウィジェットの数など
上記の例に対応して、データは次のようになります。
時間ウィンドウが毎日ある場合 はid date n_widgets n_trans_30 total_widgets_30
1 1 2015-01-01 1 1 1
2 1 2015-01-01 2 2 3
3 1 2015-01-05 3 3 6
4 1 2015-01-25 4 4 10
5 1 2015-02-15 4 2 8
6 2 2015-05-05 5 1 5
7 2 2015-01-01 2 1 2
8 3 2015-08-01 4 1 4
9 4 2015-01-01 5 1 5
その後、解決策は単純です:同様にdata %>% group_by(id, date) %>% summarize(...)
時間ウィンドウがある場合は、毎月これもlubridateと比較的簡単です:data %>% group_by(id, year(date), month(date)) %>% summarize(...)
は、私がいる課題であるしかし、どのように任意の期間のためのセットアップ時間ウィンドウをする:5日間、10日間など
ありもRcppRoll
ライブラリだが、両方RcppRoll
とzoo
でローリング機能は、より多くのセットアップに見えます定期的な時系列です。これらのウィンドウ関数は、指定された期間ではなく行数に基づいて動作することがわかります。主な違いは、日付とユーザーによって異なる期間の行がある可能性があることです。例えば、2015-01-01
の前5日間のトランザクションの数が100件の取引に等しく、同一のユーザに対して2015-02-01
の前5日間のトランザクションの数が5に等しいことを、ユーザ1のために可能
をですトランザクション。したがって、設定された数の行を検索するだけでは機能しません。
また、別のSOしかし受け入れソリューションはdata.table
を使用していたし、私はこれを具体的に実現するdplyr
方法を探しています(Create new column based on condition that exists within a rolling date)不規則時系列タイプデータのローリング日付を議論するスレッドがあります。
この問題の中心にあると思いますが、この問題は次の質問に答えることで解決できます。group_by
の任意の期間をdplyr
にするにはどうすればよいですか。また、group_by
という複雑なことなしに上記のように異なるdplyr
の方法がある場合、どうすればいいですか?
EDIT:ローリングウィンドウの性質をより明確にするための例を更新しました。
私は編集しました...あなたはそれを計算する方法を厳密にスイートに変更することができます。現在の日付を含むか含まないか、別の日付から数え始めます。 – Gopala
上記は、すべての行を現在の日付または設定された日付と比較するときには便利です。ただし、すべての行が異なる時間帯に対応していることを確認してください:2015-01-01の場合は、2014-12-28 - 2015-01-01のデータと集計する必要があります.2015-01-25の場合は2015-01-21から2015-01-25までのデータを集計します。 –
例えば、 'Sys.Date()'の代わりに 'max(date)'を使うことができますので、グループごとに異なる参照( 'id')があります。 – Gopala