0

R を使用してセッション内のユーザー セッションとアクティビティを作成および追跡するためのヘルプを探しています。大まかに言えば、ユーザー ID の列とタイムスタンプの列があります。

ユーザー ID ごとに、タイムスタンプ間の時間差を計算し、それを使用して時間制限値に基づいてセッション番号を割り当てたいと考えています。(つまり、ユーザーの最初のタイムスタンプはセッション番号 1 を取得します。次のタイムスタンプが 30 分以内の場合、セッション番号は 1 のままになり、それ以外の場合は 2 に増分されます。以下同様です。)

ユーザー アクションの観察ごとにセッション番号が割り当てられたら、各セッション内のアクティビティを順序付けたいと思います。各セッションの最初の観察の活動番号は 1、セッション内の 2 番目の観察の活動番号は 2 というようになります。セッション番号が変更される (またはユーザー ID が変更される) と、アクティビティ番号は 1 にリセットされます。

私が探していることを行う次の再現がありますが、このコードは完全なデータセット (140 万行) では非常に遅いです。特に、difftimeと for ループの呼び出しは非常に遅いです。これを行うためのより良い方法があるかどうか疑問に思っており、複数のアイデアを受け入れています。おそらく、purrr を使用して for ループを使用せずにこれを行う方法があるか、これは並列ライブラリの優れた使用例です。このプロセスを簡単にするための提案をお待ちしております。

library(tidyverse)

session_time_limit <- 30

x <- tibble(ID = c("a", "a", "a", "a", "b", "b", "c", "c", "c"),
       Date = c(as.POSIXct("2021-01-25 19:17:12 UTC"), #a1
                as.POSIXct("2021-01-25 19:17:30 UTC"), #a2
                as.POSIXct("2021-01-25 19:57:12 UTC"), #a3
                as.POSIXct("2021-01-25 19:59:12 UTC"), #a4
                as.POSIXct("2021-01-25 20:11:12 UTC"), #b1
                as.POSIXct("2021-01-25 20:42:12 UTC"), #b2
                as.POSIXct("2021-01-25 21:15:42 UTC"), #c1
                as.POSIXct("2021-01-25 21:17:12 UTC"), #c2
                as.POSIXct("2021-01-25 21:20:13 UTC"))) #c3

x <- x %>% 
  arrange(ID, Date) %>% 
  group_by(ID) %>% 
  mutate(tdiff = difftime(Date, lag(Date), units = "mins"),
         session_number = 1,
         activity_within_session = 1)

for(i in seq(2, nrow(x))) {
  if(!is.na(x$tdiff[i]) &
     #     x$ID[i] == x$ID[i-1] &
     x$tdiff[i] > session_time_limit)
  {
    x$session_number[i] = x$session_number[i-1] + 1
  } else if(!is.na(x$tdiff[i]) &
            x$ID[i] == x$ID[i-1] &
            x$tdiff[i] <= session_time_limit)
  {
    x$session_number[i] = x$session_number[i-1]
  }
}

# Activity within Session
for(i in seq(2, nrow(x))) {
  if(!is.na(x$tdiff[i]) &
     #  x$ID[i] == x$ID[i-1] &
     x$session_number[i] == x$session_number[i-1])
  {
    x$activity_within_session[i] = 
      x$activity_within_session[i-1] + 1
  }
}
4

1 に答える 1