【问题标题】:How to generate a session number in clickstream data in r?如何在 r 中的点击流数据中生成会话号?
【发布时间】:2026-02-14 21:35:01
【问题描述】:

我想添加一个新变量来指示每次点击的会话数。

我的数据集如下所示(每一行代表一次点击):

      head(test)

        CustomerID UserID Page
      1          1      1    A
      2          1      1    B
      3          1      1    C
      4          1      1    D
      5          2      2    A
      6          2      2    B

由于不同的用户会创建多个点击流,我想为每次点击分配一个会话编号。条件是,当 customerID 不同时,这将是该用户的新会话。

我想要这样:

           CustomerID UserID Page Session
      1           1      1    A       1
      2           1      1    B       1
      3           1      1    C       1
      4           1      1    D       1
      5           2      2    A       1
      6           2      2    B       1
      7           2      2    E       1
      8           2      2    F       1
      9           3      3    A       1
      10          3      3    B       1
      11          3      3    C       1
      12          3      3    G       1
      13          3      3    H       1
      14          3      3    I       1
      15          4      4    A       1
      16          4      4    B       1
      17          4      4    C       1
      18          4      4    D       1
      19          4      4    E       1
      20          5      5    A       1
      21          5      5    B       1
      22          6      6    A       1
      23          6      6    B       1
      24          7      1    A       2
      25          7      1    B       2
      26          8      2    A       2
      27          8      2    B       2
      28          8      2    C       2
      29          8      2    G       2
      30          8      2    H       2

我尝试使用 group_by() 和 mutate() 命令解决它。但是,我认为我必须创建类似 ifelse() 语句来分配正确的会话编号。我希望任何人都可以帮助我!

我尝试过的:

      test<-test  %>%   group_by(CustomerID, UserID)   %>%   mutate(Session = )

【问题讨论】:

  • 你能再显示几行数据来理解你的意思吗?从数据头看,不是那么清楚
  • 我已经添加了一个截图,希望这会有所帮助。
  • 感谢您显示更多数据以及这些数据对应的“会话”是什么,即“会话”在哪里从 1 变为 2。最好不要显示为复制图像的图像数据
  • 我现在添加了我希望如何查看数据集的完整版本。如果该 UserID 存在,则会话编号从 1 变为 2,但对应的 CustomerID 不同。

标签: r session


【解决方案1】:

这可能会有所帮助(假设 'CustomerID' 和 'UserID' 是有序的)

library(dplyr)
test %>%
     mutate(Session = cumsum(c(TRUE, diff(UserID)< 0)))
#    CustomerID UserID Page Session
#1           1      1    A       1
#2           1      1    B       1
#3           1      1    C       1
#4           1      1    D       1
#5           2      2    A       1
#6           2      2    B       1
#7           2      2    E       1
#8           2      2    F       1
#9           3      3    A       1
#10          3      3    B       1
#11          3      3    C       1
#12          3      3    G       1
#13          3      3    H       1
#14          3      3    I       1
#15          4      4    A       1
#16          4      4    B       1
#17          4      4    C       1
#18          4      4    D       1
#19          4      4    E       1
#20          5      5    A       1
#21          5      5    B       1
#22          6      6    A       1
#23          6      6    B       1
#24          7      1    A       2
#25          7      1    B       2
#26          8      2    A       2
#27          8      2    B       2
#28          8      2    C       2
#29          8      2    G       2
#30          8      2    H       2

数据

test <- structure(list(CustomerID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 6L, 6L, 7L, 
7L, 8L, 8L, 8L, 8L, 8L), UserID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 6L, 6L, 
1L, 1L, 2L, 2L, 2L, 2L, 2L), Page = c("A", "B", "C", "D", "A", 
"B", "E", "F", "A", "B", "C", "G", "H", "I", "A", "B", "C", "D", 
"E", "A", "B", "A", "B", "A", "B", "A", "B", "C", "G", "H")),
.Names = c("CustomerID", 
"UserID", "Page"), row.names = c("1", "2", "3", "4", "5", "6", 
"7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", 
"18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", 
"29", "30"), class = "data.frame")

【讨论】:

  • 您是否还有一个解决方案,其中 CustomerID 和 UserID 不必按正确的顺序排列?
  • @L.Molenaar 在这种情况下,我们可以订购它,即test %&gt;% arrange(CustomerID, UserID) %&gt;% mutate(Session = cumsum(c(TRUE, diff(UserID)&lt; 0)))
  • 好的,谢谢。我自己已经这样做了,现在效果很好。