【问题标题】:Time aggregation in RR中的时间聚合
【发布时间】:2018-01-25 16:26:49
【问题描述】:

我有包含游戏会话数据的数据集(ID、会话计数、会话的平均秒数和每个 ID 的会话日期) 这里是 mydat 的示例:

mydat=read.csv("C:/Users/Admin/desktop/rty.csv", sep=";",dec=",")



 structure(list(udid = c(74385162L, 79599601L, 79599601L, 91475825L, 
    91475825L, 91492531L, 92137561L, 96308016L, 96308016L, 96308016L, 
    96308016L, 96308016L, 96495076L, 97135620L, 97135620L, 97135620L, 
    97135620L, 97135620L, 97135620L, 97135620L, 97135620L, 97135620L, 
    97135620L, 97165942L), count = c(1L, 1L, 1L, 1L, 3L, 1L, 1L, 
    2L, 2L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L), avg_duration = c(39L, 1216L, 568L, 5L, 6L, 79L, 9L, 426L, 
    78L, 884L, 785L, 785L, 22L, 302L, 738L, 280L, 2782L, 5L, 2284L, 
    144L, 234L, 231L, 539L, 450L), date = structure(c(13L, 3L, 3L, 
    1L, 1L, 14L, 2L, 11L, 11L, 11L, 12L, 12L, 9L, 7L, 4L, 4L, 5L, 
    6L, 8L, 8L, 8L, 8L, 8L, 10L), .Label = c("11.10.16", "12.12.16", 
    "15.11.16", "15.12.16", "16.12.16", "17.12.16", "18.10.16", "18.12.16", 
    "21.10.16", "26.10.16", "28.11.16", "29.11.16", "31.10.16", "8.10.16"
    ), class = "factor")), .Names = c("udid", "count", "avg_duration", 
    "date"), class = "data.frame", row.names = c(NA, -24L))

我需要计算玩家第一次出现的日期和他最后一次出现的日期之间的时间差。 例如uid 97135620他第一次开始比赛是18.10.2016,最后一次看到他是18.12.2016,这意味着第一天和最后一天之间的差异= 60,9天, 同时uid74385162从31.10.2016开始,在他没玩后(即他玩了一次),就是第一个数据和最后一个数据的差=0。

id79599601 在 1 天内有两个会话计数(即一天我玩了 2 次),所以差异 =1

在输出中,我希望这种格式仅包含最后日期以及最后一天和第一天之间的差值。

   udid     count   avg_duration    date    datediff
    74385162    1   39             31.10.2016   0
    79599601    1   568            15.11.2016   1
    91475825    1   5              11.10.2016   1
    91492531    1   79             08.10.2016   0
    92137561    1   9              12.12.2016   0
    96308016    1   785            29.11.2016   1
    96495076    1   22             21.10.2016   0
    97135620    1   539           18.12.2016    61
    97165942    1   450           26.10.2016    0

这是怎么做到的?

【问题讨论】:

    标签: r dataframe time


    【解决方案1】:

    此函数计算第一个会话和最后一个会话之间的差异,并且只返回最后一个会话的日期:

    get_datediff <- function (x) {
        dates <- as.Date(as.character(x$date), "%d.%m.%y")
        x <- x[order(dates), ]
        if (length(x$date)==1) {
            x$datediff <- 0
        } else {
            x$datediff <- max(1, diff(range(dates)))
        }
        x[nrow(x), ]
    }
    

    然后可以将其应用于每个用户的数据,使用 dplyrmagrittr 包:

    group_by(mydat, udid) %>% do(get_datediff(.))
    
    # A tibble: 9 x 5
    # Groups:   udid [9]
          udid count avg_duration     date datediff
         <int> <int>        <int>   <fctr>    <dbl>
    1 74385162     1           39 31.10.16        0
    2 79599601     1          568 15.11.16        1
    3 91475825     3            6 11.10.16        1
    4 91492531     1           79  8.10.16        0
    5 92137561     1            9 12.12.16        0
    6 96308016     1          785 29.11.16        1
    7 96495076     1           22 21.10.16        0
    8 97135620     1          539 18.12.16       61
    9 97165942     1          450 26.10.16        0
    

    【讨论】:

      【解决方案2】:

      您描述如何计算指标的方式令人困惑,但尽可能贴近您所写的内容,我最终得出以下结论:

      dplyr 解决方案:

          timeData%>%
      mutate(dateFormat = as.Date(date, format = "%d.%m.%y"))%>%
      group_by(udid)%>%
      arrange(udid,dateFormat)%>%
      summarise(dateBetween =  difftime(last(dateFormat), first(dateFormat), units = "days"), mean(avg_duration))%>%
      left_join((timeData%>%
                 mutate(dateFormat = as.Date(date, format = "%d.%m.%y"))%>%
                   select(udid, count,dateFormat)%>%
                 group_by(udid)%>%
                 slice(which.min(dateFormat))))
      

      结果:

         # A tibble: 9 x 5
            udid dateBetween `mean(avg_duration)` count dateFormat
           <int>      <time>                <dbl> <int>     <date>
      1 74385162      0 days                 39.0     1 2016-10-31
      2 79599601      0 days                892.0     1 2016-11-15
      3 91475825      0 days                  5.5     1 2016-10-11
      4 91492531      0 days                 79.0     1 2016-10-08
      5 92137561      0 days                  9.0     1 2016-12-12
      6 96308016      1 days                591.6     1 2016-11-29
      7 96495076      0 days                 22.0     1 2016-10-21
      8 97135620     61 days                753.9     1 2016-12-18
      9 97165942      0 days                450.0     1 2016-10-26
      

      【讨论】:

        猜你喜欢
        • 2018-06-24
        • 1970-01-01
        • 2018-04-12
        • 1970-01-01
        • 1970-01-01
        • 2018-09-24
        • 2022-01-19
        • 1970-01-01
        • 2018-04-26
        相关资源
        最近更新 更多