我的数据看起来像:
player event diff
A x NA
A y 2
A z 240
A w 3
A x 9
B x NA
B y 3
B z 120
C x NA
C x 8
我所做的是按播放器列进行分组并获取时间事件之间的差异,因此每当新玩家有事件时,差异列的NA就会出现。
我想要做的是将数据划分为彼此在几分钟内的玩家特定交互(比如diff = 20的截止值)。我最终想要的是:
player event diff interaction
A x NA 1
A y 2 1
A z 240 2
A w 3 2
A x 9 2
B x NA 1
B y 3 1
B z 120 2
C x NA 1
C x 8 1
因此,基本上基于具有相同的玩家并且差异小于20来对交互进行分组,否则开始新的交互。如果存在NA,则也开始新的交互。我不确定如何以快速/有效的方式做到这一点,因为我有很多玩家拥有大量数据集。我的偏好是dplyr
解决方案
答案 0 :(得分:6)
您可以使用diff列中的coalesce
替换NA(或低于阈值的其他数字),并在diff >= 20
条件下执行cumsum,这将在diff
条件时给出一个不同的id {1}}超过某个阈值:
library(dplyr)
df %>% group_by(player) %>%
mutate(interaction = cumsum(coalesce(diff, 0L) >= 20) + 1)
# Source: local data frame [10 x 4]
# Groups: player [3]
# player event diff interaction
# <fctr> <fctr> <int> <dbl>
# 1 A x NA 1
# 2 A y 2 1
# 3 A z 240 2
# 4 A w 3 2
# 5 A x 9 2
# 6 B x NA 1
# 7 B y 3 1
# 8 B z 120 2
# 9 C x NA 1
# 10 C x 8 1
答案 1 :(得分:1)
我们也可以使用base R
来获得预期的输出
df1$interaction <- with(df1, ave(diff, player, FUN = function(x)
cumsum(x > 20 & !is.na(x))+1))
df1$interaction
#[1] 1 1 2 2 2 1 1 2 1 1