【发布时间】:2015-01-28 04:35:20
【问题描述】:
为了使这个问题更笼统,我相信它也可以改写为:创建一个滚动的时间敏感因子变量。虽然这是一个不常见的要求,但这可以用于许多不同的数据源。
我有一系列non-uniform time data,每天有超过 1 条记录,供成千上万的用户使用。我想创建一个新列 player_type 来跟踪他们行为的滚动 30 天定义。行为由他们玩的游戏定义; 'games' 列是gameA、gameB的一个因子。
因此存在三种类型的行为:
- 独家玩游戏A -
'A' - 独家玩GameB -
'B' - 玩两个游戏 -
'Hybrid'
我想使用这个新列来查看他们的游戏行为随时间的变化,以及计算每个组中的玩家数量,看看他们是如何变化的。
每个玩家的时间序列非常不规则。玩家可以每天玩多种类型的游戏,或者几个月不玩任何游戏。每个玩家的时间序列是不规则的,因此只有在玩家玩游戏时才会创建记录,因此我希望解决方案可能会使用类似以下的过滤器:
interval(current_date, current_date - new_period(days=30)(使用润滑脂)。
这是一个示例数据集。请记住,这是简化并测试滚动 1 天的更改,因此之前检查记录的简单方法实际上不起作用。 如果你能做出更好的数据集,请指教,我会编辑这篇文章。
p <- c( 1, 1, 1, 2, 2, 2, 6, 6, 6)
g <- c('A', 'B', 'B', 'A', 'B', 'A', 'A', 'B', 'B')
d <- seq(as.Date('2014-10-01'), as.Date('2014-10-9'), by=1)
df <- data.frame(player_id = p, date = d, games = g)
作为我需要的输出:
player_id date games type
1 1 2014-10-01 A A (OR NA)
2 1 2014-10-02 B Hybrid
3 1 2014-10-03 B B
4 2 2014-10-04 A A (OR NA)
5 2 2014-10-05 B Hybrid
6 2 2014-10-06 A Hybrid
7 6 2014-10-07 A A (OR NA)
8 6 2014-10-08 B Hybrid
9 6 2014-10-09 B B
解决方案应该类似于,apply 通过列,并应用一个检查 30 天时间的函数,以及一个 ifelse() 语句来查看他们玩了哪些游戏。
这是一个非常相似的帖子 - 应该有助于解决这个问题。 How do I do a conditional sum which only looks between certain date criteria
我也使用 dplyr 探索了rowwise() 和有条件的mutates(),但问题是我的历史时间组件。
感谢大家的帮助!我不能感谢这个论坛。我会经常回来查看的。
【问题讨论】:
-
在您的真实数据中,您是否需要检查每一行、所有前 30 行,或者您是否需要检查前一行(如本例所示)但行之间的增量将始终30天?
-
我需要检查前 30 天(按玩家)。这可能是很多行,或者少于 30 行。行之间的增量不一致。 他们可以在同一天玩两场比赛,也可以几个月不玩任何一场比赛。
标签: r conditional data.table dplyr date-range