2016-01-14 168 views
0

如何爲每個記錄序列分配唯一的ID?如何爲每個記錄序列分配唯一的ID?

例如,我有如下表:

time machine visitor 
11:30 A  123 
11:31 A  123 
11:33 A  123 
11:34 A  256 
11:35 A  256 
11:36 A  256 
11:37 A  256 
11:38 A  789 
11:40 A  789 
11:42 A  789 
11:50 A  123 
11:51 A  123 

當我想添加到每個記錄下會話ID結果:

time machine visitor session 
11:30 A  123  1 
11:31 A  123  1 
11:33 A  123  1 
11:34 A  256  2 
11:35 A  256  2 
11:36 A  256  2 
11:37 A  256  2 
11:38 A  789  3 
11:40 A  789  3 
11:42 A  789  3 
11:50 A  123  4 
11:51 A  123  4 

我寫了一個循環,是應該這樣做,但它太慢了:

session = 1 
for (i in 2:nrow(df)) { 
    if(df[i, ]$visitor != df[i-1, ]$visitor) 
    { 
    session = session + 1 
    } 
    df[i, ]$session = session 
} 
+1

不會變'visitor'做的工作? – Cath

+0

@Cath否,因爲訪客可以多次使用一臺機器,使他們分開會話 – souser

+1

我認爲有這樣的事情;-)你應該在你的問題和你的例子data.frame – Cath

回答

0

可能不是最清晰的方法,但您可以執行以下操作:

df$session <- cumsum(c(TRUE,as.logical(diff(df$visitor)))) 

要打破它一點:

> diff(df$visitor) #Difference between values in each row. 
[1] 0 0 133 0 0 0 533 0 0 
> c(TRUE,as.logical(diff(df$visitor))) #Converts to logical and add a lag: 
[1] TRUE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE 
> cumsum(c(TRUE,as.logical(diff(df$visitor)))) #Then cumulative sum. 
[1] 1 1 1 2 2 2 2 3 3 3 
+0

謝謝!我想過差異函數,但不知道cumsum。 – souser

+1

糾正我,如果我錯了,但我認爲這不會按預期工作,如果訪問者在連續兩行保持不變,但機器會改變。 –

+0

@docendodiscimus事實上:既然沒有在問題中提及,我根據OP的第一次嘗試回答我的答案。這與OP的循環完全相同,但效率更高。 – plannapus

1

我們可以試試

library(data.table) 
setDT(df1)[, session:= .GRP, .(visitor, machine)] 

或沒有任何分組,使用base R

v1 <- do.call(paste, df1[c('visitor', 'machine')]) 
df1$session <- match(v1, unique(v1)) 

如果 '客人' 一些休息後重復的,我們可以 '會話' 是不同的

setDT(df1)[, session := rleid(visitor)] 
df1 
# time machine visitor session 
#1: 11:30  A  123  1 
#2: 11:31  A  123  1 
#3: 11:33  A  123  1 
#4: 11:34  A  256  2 
#5: 11:35  A  256  2 
#6: 11:36  A  256  2 
#7: 11:37  A  256  2 
#8: 11:38  A  789  3 
#9: 11:40  A  789  3 
#10:11:42  A  789  3 
相關問題