2016-05-30 53 views
2

的數量,我目前工作的一個應用程序,我有一個數據幀,看起來像這樣:摺疊和計數我是比較新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

請顯示預期的輸出。也許'library(data.table); setDT(df1)[,.N,names(df1)]' – akrun

回答

2

我們可以使用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 
+0

謝謝,雖然它應該給我第一次會話的小時,在這種情況下,例如UserId#1的第一次會話是18而不是14 –

+0

@ AlbanCouturier請檢查,我更新了這篇文章 – akrun

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 
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是數字爲用戶列出的不同日期。

該函數應用於所有唯一用戶,並且最終表被轉置。