2016-05-30 16 views
2

I R relativ neu bin, und ich arbeite derzeit an einer Anwendung, wo ich einen Datenrahmen haben, die wie folgt aussieht:Collapse und zählen die Anzahl der eindeutigen Wert

 
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 

Jede Linie steht für eine Sitzung.

Ich muss feststellen, ob die Zeit der ersten Sitzung eines Benutzers sich auf die Anzahl der Sitzungen dieses Benutzers auswirken wird.

Ich habe versucht, den Befehl summaryBy:

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

Aber es gefällt mir nicht das richtige Ergebnis.

Mein Ziel ist es, die Hour der ersten Sitzung eines Benutzers zu ermitteln, bestimmen, wie viele Sitzungen und wie viele verschiedene Sitzungsdaten ein Benutzer hat.

Wenn jemand dabei helfen kann, wird es sehr cool sein!

+0

Bitte zeigen Sie die erwartete Ausgabe an. Vielleicht 'Bibliothek (data.table); setDT (df1) [, .N, Namen (df1)] ' – akrun

Antwort

2

Wir können data.table verwenden. Konvertieren Sie 'data.frame' in 'data.table' (setDT(df1)), gruppiert nach 'UserId', wir order das 'Datum', erhalten Sie die first 'Stunde', die Gesamtzahl der Sitzungen (.N) und die Nummer unique Datum Elemente (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

Danke, obwohl es mir die Stunde der ersten Sitzung geben sollte, in diesem Fall zum Beispiel UserId # 1 haben ihre erste Sitzung um 18 und nicht um 14 –

+0

@ AlbanCouturier Bitte überprüfen Sie, ich habe den Beitrag aktualisiert – akrun

0

Sie auch diese dplyr mit tun könnte:

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

Mit base Befehlen können Sie Ihre eigene Funktion schreiben, um die gewünschten Informationen auswählen:

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 

Hier ist FirstHour die Stunde In der ersten aufgelisteten Zeile für den angegebenen Benutzer ist Sessions die Anzahl der Zeilen für den Benutzer und Dates ist die Nummer von verschiedenen Daten für den Benutzer aufgeführt.

Die Funktion wird auf alle eindeutigen Benutzer angewendet und die Finaltabelle wird transponiert.

Verwandte Themen