所以我有一个表,其中每一行代表特定事件中的给定用户。每行包含两种类型的信息:此类事件的结果,以及有关用户的具体数据。多个用户可以参加同一个活动。
为清楚起见,以下是此类表格的简化示例:
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的第三次出现开始显示其先前表演的滚动平均值。
如果我只处理一个用户,我只需计算其属性的移动平均值,然后仅将属性列中的数据向下移动一行来解决此问题。我的问题是:
可以假设所有行都已按日期排序。还欢迎任何与此问题相关的其他提示或参考。
此外,如何用单线标题总结我的问题并不明显,所以我愿意接受任何R专家的建议,他们可能会想到一种改进的描述方式。
答案 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
函数cummean
,lag
,并使用ifelse
将NA替换为0) 。
完成此操作后,我们会将数据重新排列为原始状态,并将其取消组合。