R 为时差设置会话计数器

R 为时差设置会话计数器,r,R,我有一个表格,它捕获了网站用户之间的交互。列“id”是用户的唯一标识符“时间”是当前交互与上次交互的时间差conv'表示用户是否转换的步骤(1,0)。用户可能多次转换或根本不转换。我需要标记一个会话计数器,其逻辑如下: 当id相同且差值小于10时,计数器应给出前面的计数器值 当id相同且差值大于10时,计数器应增加+1 当id更改时,计数器应重置为1。此外,在用户已转换(即conv=1)且“时间”大于10后,计数器应重置为1。 虚拟数据帧如下所示: df <- data.frame(id

我有一个表格,它捕获了网站用户之间的交互。列“id”是用户的唯一标识符“时间”是当前交互与上次交互的时间差conv'表示用户是否转换的步骤(1,0)。用户可能多次转换或根本不转换。我需要标记一个会话计数器,其逻辑如下:

  • 当id相同且差值小于10时,计数器应给出前面的计数器值
  • 当id相同且差值大于10时,计数器应增加+1
  • 当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  
    

  • 您可能希望在行之间循环。下面是一个示例(不确定它是否给出了您想要的确切结果,示例有点混乱,但您可以使用相同的方法):

    df
    
    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  
    
    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
    
        }
    }