根据R

时间:2016-09-18 01:08:02

标签: r dplyr

我的数据看起来像:

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解决方案

2 个答案:

答案 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