2016-04-04 15 views
-1

ich eine Datentabelle myTable wie diese (Eingang) haben:Aggregation von data.table (R Sprache)

user_id timestamp event_id 

1 Ann  11115555 Level1Start 
2 Serg  11113333 Level1Start 
3 Ann  11117777 Level1Complete 
4 Ann  11116666 Level1Complete 
5 Ann  11112222 Level1Start 

Ich brauche die Spalte mit dem Namen timeInLevel und berechnen Zeit zwischen den ersten beiden Protokolle Level1Start und Level1Complete hinzuzufügen.

Ausgang:

user_id timestamp event_id   TimeInLevel 

1 Ann  11115555 Level1Start  4444 
2 Serg  11113333 Level1Start  NA 
3 Ann  11117777 Level1Complete 4444 
4 Ann  11116666 Level1Complete 4444 
5 Ann  11112222 Level1Start  4444 

THX für die Hilfe !!!

+2

Wo '4444' kommen aus? – mtoto

+0

@ mtto it't Timestamp Unterschied zwischen Logs №5 №4 (11116666 - 11112222). Es ist erstens, weil ihr Zeitstempel der kleinste ist. Und NA, weil Serg keine Protokolle mit Level1Complete hat. – Smasell

Antwort

3

Vielleicht so etwas wie dies mit data.table Syntax:

dt[, TimeInterval := min(timestamp[event_id == "Level1Complete"]) - 
    min(timestamp[event_id == "Level1Start"]), by = user_id] 
# user_id timestamp  event_id TimeInterval 
#1:  Ann 11115555 Level1Start   4444 
#2: Serg 11113333 Level1Start   NA 
#3:  Ann 11117777 Level1Complete   4444 
#4:  Ann 11116666 Level1Complete   4444 
#5:  Ann 11112222 Level1Start   4444 
+0

Haben Sie diesen Fehler? Der Typ von RHS ('double') muss mit LHS ('integer') übereinstimmen. Zu überprüfen und zu erzwingen würde die Leistung für die schnellsten Fälle zu sehr beeinträchtigen. Ändere entweder den Typ der Zielspalte oder erzwinge den RHS von: = dir selbst (zB indem 1L anstelle von 1 verwendet wird) ' – Smasell

+0

' data.table' beschwert sich wegen des fehlenden 'Level1Complete' für' Serge', allerdings sollte die Ausgabe erfolgen ist immer noch korrekt, wenn Sie '> dt' ausführen. – mtoto

+0

Es tut mir leid, es funktioniert nicht. Es berechnet nur mehrere Benutzer. Der Rest bleibt bei NA in 'TimeInterval' – Smasell

Verwandte Themen