2016-09-18 47 views
2

我有一个看起来像数据:创建行索引基于R中的时间差

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

回答

6

您可以在差异列使用​​3210 0(或其他数低于你的阈值)代替NA,做对diff >= 20条件cumsum,这将给一个独特的ID,每当diff超过某个阈值:

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

我们也可以使用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