2016-09-18 48 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