2017-03-10 2 views
0

私はすべての行が特定のイベントの特定のユーザーを表すテーブルを持っています。各行には、そのようなイベントの結果とユーザーに関するデータの2種類の情報が含まれています。複数のユーザーが同じイベントに参加することができます。明確にするためにRの前のローのローリング平均を使用してテーブルを更新していますか?

は、ここでは、そのような表の簡単な例です:

EventID  Date Revenue Time(s) UserID  X  Y Z 
     1 1/1/2017  $10  120  1  3  2 2 
     1 1/1/2017  $15  150  2  2  1 2 
     2 2/1/2017  $50  60  1  1  5 1 
     2 2/1/2017  $45  100  4  3  5 2 
     3 3/1/2017  $25  75  1  2  3 1 
     3 3/1/2017  $20  210  2  5  5 1 
     3 3/1/2017  $25  120  3  1  0 4 
     3 3/1/2017  $15  100  4  3  1 1 
     4 4/1/2017  $75  25  4  0  2 1 

私の目標は、特定のユーザーのパフォーマンス履歴を与えることができたモデルを構築することである(例ではX、YおよびZの属性)イベントの特定の収益と時間を予測します。

私は今、そのようなモデルを訓練し、テストするために自分のデータをフォーマットする方法です。具体的には、前のイベントまでの各ユーザー属性の移動平均を提示しながら、各行がイベント固有の情報を保持するように表を変換したいとします。思考プロセスの一例は、ユーザのユーザが属性X、Y、Zのそれぞれ平均2,3.5,1.5を提示するまで、そのイベントの収入と時間の結果は25ドルと75ドルこれを私のトレーニングのインプットとして使用します。

もう一度明確にするため、ここで私は、元のテーブルの上に、このようなロジックを適用期待される出力の例です

EventID  Date Revenue Time(s) UserID  X  Y Z 
     1 1/1/2017  $10  120  1  0  0 0 
     1 1/1/2017  $15  150  2  0  0 0 
     2 2/1/2017  $50  60  1  3  2 2 
     2 2/1/2017  $45  100  4  0  0 0 
     3 3/1/2017  $25  75  1  2 3.5 1.5 
     3 3/1/2017  $20  210  2  2  1 2 
     3 3/1/2017  $25  120  3  0  0 0 
     3 3/1/2017  $15  100  4  3  5 2 
     4 4/1/2017  $75  25  4  3  3 1.5 

我々はまだ知っているので、各ユーザーが初登場ですべての属性は、0あることに注目してください彼らについては何もない。また、ユーザーの2回目の出現で、私たちが知っていることは、彼が最初に出演した結果です。 5行目と9行目では、ユーザ1と4の3回目の出現は、前回の演奏のローリング平均を示し始めます。

1人のユーザーしか扱っていなかった場合、属性の移動平均を計算し、属性列のデータだけを1行だけシフトするだけで、この問題に取り組んでいます。私の質問は次のとおりです。

  • 複数のユーザーがいるテーブルを扱うときに、ユーザーIDでフィルタリングされたそのようなシフトを実行する方法はありますか?
  • また、各ユーザーの次回の表示に常に結果を配置することによって、元の表から直接ローリング平均を計算するより良い方法がありますか?

すべての行がすでに日付順にソートされていると仮定できます。この問題に関連する他のヒントや参考資料も歓迎します。

また、1つのライナータイトルで質問を要約する方法は明白ではなかったので、Rエキスパートからの提案には改善の方法を考えてもよいと思っています。

答えて

1

dplyrパッケージを使用して、希望の出力を達成できます。

library(dplyr) 

tablinka %>% 
     arrange(UserID, EventID) %>% 
     group_by(UserID) %>% 
     mutate_at(c("X", "Y", "Z"), cummean) %>% 
     mutate_at(c("X", "Y", "Z"), lag) %>% 
     mutate_at(c("X", "Y", "Z"), funs(ifelse(is.na(.), 0, .))) %>% 
     arrange(EventID, UserID) %>% 
     ungroup() 

我々は、データを配置グループこと、および所望の変換(dplyr機能cummeanlag、及びifelseを用いて0とNAを交換)を適用します。

これが完了すると、データが元の状態に再配置され、グループ解除されます。

+0

私は後で何をしたのですか、助けてくれてありがとう@JuanBosco! – htaunay

関連する問題