2017-03-08 4 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 

データに関して順序付けられています各ユーザーと時間を基準にしています。

私はデータセットの各行にセッション番号を追加できるように、ユーザーと一連のタイムスタンプをループする方法はありますか?

私は次のコードで開始しましたが、動作しませんし、セッション番号を追加する方法もわかりません。ここで

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は実際にデータフレームの名前です。 [introduction vignette](https://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html)を読んでみてください。 %>%(パイプ演算子)もここで説明します。 – Edwin

+0

この解決法は私を大いに助けてくれました。再構成者+1について何が壊れていたのか理解しようとする – Surpdeh

関連する問題