3

我对 R 比较陌生,我目前正在开发一个应用程序,其中有一个如下所示的数据框:

数据库
用户 ID 小时日期
01 18 01.01.2016
01 18 01.01.2016
01 14 02.01.2016
01 14 02.01.2016
02 21 02.01.2016
02 08 05.01.2016
02 08 05.01.2016
03 23 05.01.2016

每行代表一个会话。

我需要确定用户第一次会话的时间是否会影响该用户将要进行的会话数。

我试过命令summaryBy

library(doBy)
first_hour <- summaryBy(UserId + Hour + Date ~ UserId, 
    FUN=c(head, length, unique), database)

但这并没有给我正确的结果。

我的目标是确定Hour用户参加的第一个会话,确定用户有多少个会话和多少个不同的会话日期。

如果有人可以帮助解决这个问题,那将非常酷!

4

3 回答 3

2

我们可以使用data.table. 将“data.frame”转换为“data.table”(setDT(df1)),按“UserId”分组,我们order是“日期”,得到first“小时”、会话总数(.N)和unique日期元素的数量(uniqueN(Date))。

library(data.table)
setDT(df1)[order(UserId, as.Date(Date, "%m.%d.%Y")),.(Hour = Hour[1L],
      Sessions = .N, DifferSessionDate = uniqueN(Date)) , by = UserId]
#    UserId Hour Sessions DifferSessionDate
#1:      1   18        4                 2
#2:      2   21        3                 2
#3:      3   23        1                 1
于 2016-05-30T10:17:36.940 回答
0

使用base命令,您可以编写自己的函数来选择所需的信息:

user.info <- function(user){
    temp <- subset(Database, Database$UserId == user)
    return(c(UserId=user, FirstHour=temp$Hour[1], Sessions=nrow(temp), Dates=length(unique(temp$Date))))
}

t(sapply(unique(Database$UserId), FUN=user.info)) 
#     UserId FirstHour Sessions Dates
# [1,]      1        18        4     2
# [2,]      2        21        3     2
# [3,]      3        23        1     1

这里,FirstHour是给定用户列出的第一行的小时,Sessions是用户的行数,是为用户Dates列出的不同日期的数量。

该函数适用于所有唯一用户,并转置最终表。

于 2016-05-30T11:33:55.517 回答
0

您也可以使用以下方法执行此操作dplyr

library(dplyr)
dt %>% group_by(UserId) %>% summarise(FirstHour = min(Hour),
                                      NumSessions = n(),
                                      NumDates = length(unique(Date)))

Source: local data frame [3 x 4]

  UserId FirstHour NumSessions NumDates
   (int)     (int)       (int)    (int)
1      1        14           4        2
2      2         8           3        2
3      3        23           1        1
于 2016-05-30T10:25:37.807 回答