2017-03-08 23 views
0

我有一系列代表用戶在網站上的活動的時間戳。我想將這些時間戳區分爲每個用戶的會話(定義爲時間戳不超過每個用戶1800秒)。如果可能的話,我想在我的數據集中添加一個名爲session_nr的列。 (。例如,如果時間戳是相距超過1800秒,或者它是一個新的用戶會話號應該增加)將時間戳標記爲R中的會話

的樣品數據集看起來像這樣:

user_id    date  
58683  2015-08-01 07:18:13 
58683  2015-08-01 07:18:19 
58683  2015-08-01 07:18:33 
58683  2015-08-01 07:18:43 
58683  2015-08-01 07:18:51 
58683  2015-08-01 07:18:58 

的數據被有序相對於每個用戶和時間。

有沒有辦法在R中循環遍歷用戶和一系列時間戳,以便我可以在我的數據集的每一行中添加會話編號?

我已經開始使用下面的代碼,但它不工作,也不知道如何添加會話編號。

user_session <- function(user, time_limit, data){ 
    u1 <- data[which(data$user_id == user),] 
    Sys.setlocale("LC_TIME", "en_US.UTF-8") 
    u1$date <- as.POSIXct(u1$date) 

    u1$s.start <- c(TRUE, timediff(u1$date) > time_limit) 
    u1$s.stop <- c(u1$s.start[2:length(u1$s.start)], TRUE) 

    u1$sessions <- data.frame(
    s.1 = which(u1$s.start), # starts 
    s.2 = which(u1$s.stop)) # stops 

    return(u1) 
} 

use <- as.data.frame(unique(data$user_id)) 
    time_limit <- 1800 
    for (i in dim(use)[1]){ 
    user <- use[i,1] 
    res <- user_session(user, time_limit, data) 
} 

回答

1

這裏是一個dplyr解決方案:

library(dplyr) 
df %>% group_by(id) %>% 
    mutate(time_since_last = as.numeric(date - lag(date))) %>% 
    mutate(new_session = is.na(time_since_last) | time_since_last > 1800) %>% 
    mutate(session_nr = cumsum(new_session)) 
+0

您好,我從來沒有使用過的dplyr庫之前,所以我不明白的語法。這意味着我無法修改代碼以在我的腳本中工作。 df是data.frame的名字嗎? %>%是什麼意思? – Sofie

+0

df確實是數據框的名稱。您可能需要閱讀[介紹小插曲](https://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html)。 %>%(管道運算符)也在這裏解釋。 – Edwin

+0

這個解決方案幫助我大量c.f.試圖瞭解重建+1的問題 – Surpdeh