R中的时间聚合

问题描述 投票:1回答:2

我有数据集与gamesessions的数据(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第一次开始比赛是在2016年10月18日和上次他在2016年12月18日看到,这意味着第一天和最后一天的差异= 60,9天,同时uid74385162开始于2016年10月31日和在他没有比赛之后(即他打了一次),这意味着第一个数据和最后一个数据之间的差异= 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
2个回答
2
投票

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

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

1
投票

您描述计算指标的方式令人困惑,但是尽可能地遵循您所写的内容,我最终得到以下结果:

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
© www.soinside.com 2019 - 2024. All rights reserved.