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

使用R中以前行的滚动平均值更新表?,r,moving-average,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

因此,我有一个表,其中每一行表示特定事件中的给定用户。每行包含两种类型的信息:此类事件的结果,以及特定用户的数据。多个用户可以参与同一事件

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

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专家的建议,他们可能会想出一种更好的描述方法

我们可以使用dplyr软件包实现您想要的输出

我们对数据进行排列、分组,然后应用dplyr函数cummean、lag所需的转换,并使用ifelse将NA替换为0


完成后,我们将数据重新排列到原始状态,并将其解组。

正是我想要的,谢谢@JuanBosco的帮助!
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()