2016-04-10 7 views
0

ich eine Tabelle (Eingang) haben:Lassen Sie nur letzte Ereignisnamen für jeden Benutzer (r Sprache)

user_id timestamp progression 

1 Rob  22223333 Level1 
2 Mike 33334444 Level2 
3 Rob  55558888 Level3 
4 Mike 44447777 Level7 

I Spalte mit der letzten progression hinzufügen müssen, die auf timestamp abhängt.

gewünschter Ausgang:

user_id timestamp progression lastProgression 

1 Rob  22223333 Level1  Level3 
2 Mike 33334444 Level2  Level7 
3 Rob  55558888 Level3  Level3 
4 Mike 44447777 Level7  Level7 
+3

Es gibt wohl keine Notwendigkeit für ein externes Paket hier, aber ich würde mit 'library (data.table) gehen; setDT (df) [unique (df [Reihenfolge (-timestamp)], by = "user_id"), lastProgression: = i.progress, on = "user_id"] 'für Effizienz –

+0

Oder' setDT (df) [, lastProgression: = progression [which.max (timestamp)], by = user_id] ' –

Antwort

4

Mit ave von base R, können wir die letzte Beobachtung (tail(x, 1)) nach dem Gruppieren von 'User_id' (unter der Annahme, dass der 'Zeitstempel') wählen früher bestellt wird.

df1$lastProgression <- with(df1, ave(progression, user_id, FUN= function(x) tail(x,1))) 

Oder mit dplyr

library(dplyr) 
df1 %>% 
    group_by(user_id) %>% 
    arrange(desc(timestamp)) %>% 
    mutate(lastProgression = first(progression)) 

oder eine modifizierte Option which.max (Fa @docendo discimus Kommentare)

df1 %>% 
    group_by(user_id) %>% 
    mutate(lastProgression = progression[which.max(timestamp)]) 
+1

Ich habe verstanden, dass die Frage von' timestamp' abhängt, dh es ist nicht unbedingt der letzte Eintrag (kann aber falsch sein) –

+0

@docendodiscimus I aktualisiert mit einem 'dplyr 'Option, wo der erste Wert ausgewählt wird. – akrun

+0

Da 'timestamp' eine numerische/Integer-Variable ist, könnte man auch' group_by (df1, user_id)%>% mutate (lastProgression = progression [which.max (timestamp)]) 'verwenden –

Verwandte Themen