2015-05-17 12 views
9

Ho un tbl_df che assomiglia a questo:dplyr - Get ultimo valore per ogni anno

> 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 
..  ... ... ... 

cui date variano attraversato diversi anni.

Vorrei ottenere l'ultimo valore di value per ogni anno (che non è sempre il 31-12). C'è un modo per farlo usando un idioma come: d %>% group_by(year) %>% summarise(...)?

risposta

20

Qui ci sono alcune opzioni

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

O può essere (non molto chiaro nella descrizione)

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

O

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

Oppure possiamo usare arrange per ordinare il ' data '(nel caso non sia ordinato) e ottenere il valore last

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

Nel caso, si vuole provare con data.table, ecco uno

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

O come ha commentato @ David Arenburg

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

@DavidArenburg Cioè esilaranti 'reali men' :-) – akrun

+0

@DavidArenburg Intendevi 'setorder (setDT (d), anno, data) [, valore [quale.max (data)], anno]'? – akrun

Problemi correlati