2016-04-10 17 views
0

için sadece son olay adını bırak:Bir tablo (girişi) sahip her kullanıcı (r dili)

user_id timestamp progression 

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

Ben timestamp bağlıdır son progression ile sütun eklemek gerekir.

İstenilen çıktı: base R den ave kullanma

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

harici paketine gerek burada muhtemelen vardır, ama ben kütüphaneyle (data.table) giderdim; setDT (df) [benzersiz (df [sipariş (-timestamp)], by = "user_id"), lastProgression: = i.progression, on = "user_id"] 'verimlilik için –

+0

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

cevap

4

, daha önce sipariş edilir ('damgası' olduğunu varsayarak) 'user_id' tarafından gruplama sonra son bir gözlem (tail(x, 1)) seçebilir.


Ya dplyr

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

ya da (@docendo discimus yorumlardan) which.max kullanılarak modifiye seçeneği ile

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

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

'timestamp' değerine bağlı olarak soruyu anladım, yani mutlaka son giriş değil (yanlış olabilir) –

+0

@docendodiscimus' dplyr ile güncellendi '' first' değerini seçmek için sipariş alındığında seçeneği. – akrun

+0

"Zaman damgası" bir sayısal/tamsayı değişkeni olduğundan, "group_by (df1, user_id)%>% mutate (lastProgression = progression [which.max (timestamp)])' işlevini de kullanabileceğinizi düşünüyorum –