2016-04-10 21 views
0

只留下最后一个事件名字我有一个表(输入):为每个用户(R语言)

user_id timestamp progression 

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

我需要与去年progression取决于timestamp添加列。

所需的输出:

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

有可能是没有必要的外部包在这里,但我会用'library(data.table); setDT(df)[unique(df [order(-timestamp)],by =“user_id”),lastProgression:= i.progression,on =“user_id”]'效率 –

+0

或'setDT(df)[,lastProgression: =进展[which.max(timestamp)],by = user_id]' –

回答

4

base R使用ave,我们可以通过 'USER_ID'(假设 '时间戳')早下令分组后选择最后一个观察(tail(x, 1))。

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

或用dplyr

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

或使用which.max修改的选项(从@docendo discimus评论)

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

我明白这个问题取决于'timestamp',即它不一定是最后一个条目(但可能是错误的) –

+0

@docendodiscimus我更新了'dplyr '选项,它被命令选择'first'值。 – akrun

+0

由于'timestamp'是一个数字/整数变量,我想你也可以使用'group_by(df1,user_id)%>%mutate(lastProgression = progression [which.max(timestamp)])'' –