折叠并计算唯一值的数量
Collapse and count the number of unique value
我是 R 的新手,我目前正在开发一个应用程序,其中的数据框如下所示:
Database
UserId Hour Date
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
,确定用户有多少个会话以及多少个不同的会话日期。
如果有人可以帮助解决这个问题,那就太棒了!
我们可以使用data.table
。将'data.frame'转换为'data.table'(setDT(df1)
),按'UserId'分组,我们order
得到'Date',得到first
'Hour'、会话总数 (.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
您也可以使用 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
使用base
命令,您可以编写自己的函数来select需要的信息:
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
是不同日期的数量为用户列出。
函数应用于所有唯一身份用户,最终table被转置。
我是 R 的新手,我目前正在开发一个应用程序,其中的数据框如下所示:
Database UserId Hour Date 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
,确定用户有多少个会话以及多少个不同的会话日期。
如果有人可以帮助解决这个问题,那就太棒了!
我们可以使用data.table
。将'data.frame'转换为'data.table'(setDT(df1)
),按'UserId'分组,我们order
得到'Date',得到first
'Hour'、会话总数 (.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
您也可以使用 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
使用base
命令,您可以编写自己的函数来select需要的信息:
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
是不同日期的数量为用户列出。
函数应用于所有唯一身份用户,最终table被转置。