2017-06-29 105 views
0

我有一個表格,它捕捉網站用戶的交互。列'id'是用戶的唯一標識符。 '時間'是目前與最後一次互動的時間差。 'conv'代表用戶轉換或不轉換的步驟(1,0)。用戶可能會轉換幾次或根本不轉換。我需要標記會話計數器,其邏輯如下:爲時差設置會話計數器

  1. 當id相同且diff小於10時,計數器應給出前面的計數器值。
  2. 當id相同且diff大於10時,計數器應加1。
  3. 當id更改計數器應重置爲1.同樣在用戶轉換(即conv = 1)並且'時間'大於10時,計數器應重置爲1。 僞數據幀應該是這樣的:

    df <- data.frame(id = c(1,1,1,1,1,1,1,1,1,1,1,2,2,2), conv = c(0,0,0,0,1,0,0,0,0,1,0,0,0,0), time= c(0,3,15,18,9,5,17,7,15,5,5,45,40,5)) 
    
    id |conv |time  
    ---- 
    1 | 0 | 0  
    1 | 0 | 3  
    1 | 0 | 15  
    1 | 0 | 18  
    1 | 1 | 9  
    1 | 0 | 5  
    1 | 0 | 17  
    1 | 0 | 7  
    1 | 0 | 15  
    1 | 1 | 5  
    1 | 0 | 5  
    2 | 0 | 0  
    2 | 0 | 40  
    2 | 0 | 5 
    

    決賽桌應該是這樣的:

    id |conv |time | counter 
    ---- 
    1 | 0 | 0 | 1 
    1 | 0 | 3 | 1 
    1 | 0 | 15 | 2  
    1 | 0 | 18 | 3 
    1 | 1 | 9 | 3 
    1 | 0 | 5 | 3 
    1 | 0 | 17 | 1 
    1 | 0 | 7 | 1 
    1 | 0 | 15 | 2 
    1 | 1 | 5 | 2 
    1 | 0 | 5 | 2 
    2 | 0 | 0 | 1 
    2 | 0 | 40 | 2 
    2 | 0 | 5 | 2 
    

回答

0

你可能想通過行循環。這裏是一個例子(不知道它是否給了你想要的確切結果,這個例子有點令人困惑,但你可以使用相同的方法):

df <- data.frame(id= c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2), 
       conv= c(0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0), 
       time= c(0, 3, 15, 18, 9, 5, 17, 7, 15, 5, 5, 45, 40, 5), 
       counter= numeric(0)) 



for (i in c(2:nrow(df))){ # For each row in the data frame (starting at row #2): 

    if (df[i, "id"] == df[i - 1, "id"]){ # If current row's ID equals previous rows ID.. 

     # definitions for clarity 
     time <- df[i, "time"] 
     prev_time <- df[i - 1, "time"] 

     if (abs(time - prev_time) < 10){ # if absolute diff less than 10 
      df[i, "counter"] <- df[i - 1, "counter"] # current time = previous time 
     } else { 
      df[i, "counter"] <- df[i, "counter"] + 1 # current time incremented by 1 
     } 

     # check conv 
     if (df[i, "conv"] == 1 & df[i, "time"] > 10){ 
      df[i, "counter"] <- 1 
     } 


    } else { # If the ID numbers don't match 

     df[i, "counter"] <- 1 # set counter to 1 

    } 
}