用 R 中前几行的滚动平均值更新 table?

Updating a table with the rolling average of previous rows in R?

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

为清楚起见,这里有一个这样的简化示例 table:

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

我的目标是构建一个模型,该模型可以根据特定用户的性能历史记录(在示例属性 X、Y 和 Z 中)预测事件的给定收入和时间。

我现在想要的是一种格式化我的数据以便训练和测试这种模型的方法。更具体地说,我想以每行保留事件特定信息的方式转换 table,同时呈现每个用户属性的移动平均值,直到上一个事件。思考过程的一个例子可能是:一个用户 直到一个事件 在属性 X、Y 和 Z 中分别呈现 2、3.5 和 1.5 的平均值,以及收入和时间结果这样的活动分别是 25 美元和 75 美元,现在我将把它作为我训练的输入。

再次为清楚起见,这里是我希望在原始 table 上应用此类逻辑的输出示例:

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

注意每个用户第一次出现时所有属性都是0,因为我们对他们一无所知。此外,在用户第二次出现时,我们所知道的只是他第一次出现的结果。在第 5 行和第 9 行中,用户 1 和 4 第三次出现开始显示他们之前表现的滚动平均值。

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

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

此外,如何用一个线性标题来总结我的问题并不明显,所以我愿意听取任何可能想到改进描述方式的 R 专家的建议。

我们可以使用 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,并使用 [=15= 将 NA 替换为 0 ]).

完成后,我们将数据重新排列到其原始状态,然后取消分组。