使用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()