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