使用R中前一行的滚动平均值更新表格?

时间:2017-03-10 16:34:59

标签: r moving-average

所以我有一个表,其中每一行代表特定事件中的给定用户。每行包含两种类型的信息:此类事件的结果,以及有关用户的具体数据。多个用户可以参加同一个活动。

为清楚起见,以下是此类表格的简化示例:

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 个答案:

答案 0 :(得分: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将NA替换为0) 。

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