【问题标题】:Generate SessionId from UserId and difference in TimeStamps without sorting UserID从 UserId 生成 SessionId 和 TimeStamps 的差异,而不对 UserID 进行排序
【发布时间】:2019-06-14 00:43:15
【问题描述】:

我正在尝试从UserId 生成SessionIdtimestamps 的差异。表中的第一个用户显然被分配了 1,如果同一个用户登录并且当前登录和先前登录之间的差异小于 5 分钟,则 sessionId 必须从那里增加 1,否则它必须增加 1。我可以使用for 循环和nested if 语句来做到这一点,但想知道是否可以使用dplyr 或类似的包来完成。已经有一个类似的问题here,但它对 UserId 进行排序,我想在不排序 UserId 的情况下实现这一点。

Input and Output(SessionId) is in the same table.
 CustomerID           TimeStamp SessionID
        101 0000-01-01 01:00:00         1
        101 0000-01-01 01:03:00         1
        102 0000-01-01 01:05:00         2
        103 0000-01-01 01:06:00         3
        104 0000-01-01 01:06:00         4
        101 0000-01-01 01:09:00         5
        105 0000-01-01 01:10:00         6
        104 0000-01-01 01:10:00         4
        106 0000-01-01 01:11:00         7
        105 0000-01-01 01:12:00         6
        104 0000-01-01 01:12:00         4
        104 0000-01-01 01:18:00         8
        104 0000-01-01 01:20:00         8
        105 0000-01-01 01:21:00         9
        104 0000-01-01 01:26:00        10

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    在您的情况下,您可以使用group_by 并将组内不同的时间转换为cumsum(这是确定最终组号的附加关键帮助之一),然后我们使用factor 和@987654324 @

    df = df %>% group_by(CustomerID) %>% 
          mutate(x=paste(CustomerID, cumsum(c(F, diff(TimeStamp))>5)))
    df$x = as.numeric(factor(df$x, as.character(unique(df$x))))
    df
    # A tibble: 15 x 4
    # Groups:   CustomerID [6]
       CustomerID           TimeStamp SessionID     x
            <int>              <dttm>     <int> <dbl>
     1        101 0000-01-01 01:00:00         1     1
     2        101 0000-01-01 01:03:00         1     1
     3        102 0000-01-01 01:05:00         2     2
     4        103 0000-01-01 01:06:00         3     3
     5        104 0000-01-01 01:06:00         4     4
     6        101 0000-01-01 01:09:00         5     5
     7        105 0000-01-01 01:10:00         6     6
     8        104 0000-01-01 01:10:00         4     4
     9        106 0000-01-01 01:11:00         7     7
    10        105 0000-01-01 01:12:00         6     6
    11        104 0000-01-01 01:12:00         4     4
    12        104 0000-01-01 01:18:00         8     8
    13        104 0000-01-01 01:20:00         8     8
    14        105 0000-01-01 01:21:00         9     9
    15        104 0000-01-01 01:26:00        10    10
    

    【讨论】:

    • 虽然我理解你想要做什么,但我无法用你的代码重现输出。
    • 我怎么也想不到这个逻辑,有什么思考的技巧吗?
    • @JasonMathews 当然,首先我们在每个组中创建帮助键,并将子键与 CustomerID 结合,使用因子对其进行编码,然后我们在这里得到你需要的。 :-)
    • 甜!!必须像一拳超人一样思考:)。无论如何,谢谢。
    猜你喜欢
    • 2014-03-23
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 2019-02-09
    • 2019-10-08
    • 1970-01-01
    相关资源
    最近更新 更多