2015-05-17 19 views
9

ich eine tbl_df haben, die wie folgt aussieht:dplyr - Get letzte Wert für jedes Jahr

> d 
Source: local data frame [3,703 x 3] 

     date value year 
1 2001-01-01 0.1218 2001 
2 2001-01-02 0.1216 2001 
3 2001-01-03 0.1216 2001 
4 2001-01-04 0.1214 2001 
5 2001-01-05 0.1214 2001 
..  ... ... ... 

wo Daten mehrere Jahre reichen accross.

Ich möchte für jedes Jahr den neuesten Wert von value bekommen (was nicht konsistent die 31-12 ist). Gibt es eine Möglichkeit, das mit einem Idiom wie: d %>% group_by(year) %>% summarise(...) zu tun?

Antwort

20

Hier sind einige Optionen

library(dplyr) 
d %>% 
    group_by(year) %>% 
    summarise(value=last(value)) 

Oder kann

d %>% 
    group_by(year) %>% 
    slice(which.max(date)) %>% 
    select(value) 

Oder

d %>% 
    group_by(year) %>% 
    filter(date==max(date)) %>% 
    select(value) 

Oder wir können arrange (in der Beschreibung nicht ganz klar) sein verwenden, um die Bestellung ' Datum '(falls es nicht bestellt wurde) und erhalten den last Wert

d %>% 
    group_by(year) %>% 
    arrange(date) %>% 
    summarise(value=last(value)) 

Im Fall möchten Sie mit data.table versuchen, hier ist ein

library(data.table) 
setDT(d)[, value[which.max(date)], year] 

Oder wie @ David Arenburg kommentiert

unique(setDT(d)[order(-date)], by = "year") 
+0

@DavidArenburg Das ist urkomisch 'echte men' :-) – akrun

+0

@DavidArenburg Du meintest 'setorder (setDT (d), Jahr, Datum) [, Wert [which.max (Datum)], Jahr]'? – akrun