2017-03-10 28 views
0

所以我有一个表,每行代表特定事件中的给定用户。每行包含两类信息:此类事件的结果以及特定用户的数据。多个用户可以参加同一个事件。用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,因为我们还知道没有关于他们。另外,在用户的第二次露面中,我们所知道的只是他第一次露面的结果。在第5和第9行中,用户1和4的第三次露面开始显示他们之前表演的滚动平均值。

如果我只处理一个用户,我会解决这个问题,只需计算他的属性的移动平均值,然后只将属性列中的数据向下移动一行。我的问题是:

  • 有没有办法执行这种转变过滤由UserID,当处理与多个用户的表?
  • 或者在R中有更好的方法直接从原始表格计算滚动平均值,方法是始终在每个用户的下一次出现中放置结果?

它可以假定所有的行已经按日期排序。任何与此问题有关的其他提示或参考也是受欢迎的。

而且,这不是明显的如何总结一下我有一个衬垫标题问题,所以我愿意从想象的描述它的改进方式任意[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,并用0使用ifelse替换NA)。

完成此操作后,我们将数据重新排列为其原始状态,并将其取消组合。

+0

正是我之后,感谢@JuanBosco的帮助! – htaunay