我是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
,确定用户拥有的会话数和会话日期数。
如果有人可以提供帮助,那将非常酷!
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分: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
是列出的不同日期的数量用户。
该功能适用于所有唯一用户,并且最终表格已转置。