2015-05-17 14 views
9

Mam tbl_df, który wygląda tak:dplyr - Get ostatnią wartość dla każdego roku

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

gdzie wahać daty drugiej stronie kilka lat.

Chciałbym uzyskać najnowszą wartość value za każdy rok (który niekonsekwentnie jest liczbą 31-12). Czy istnieje sposób, aby to zrobić za pomocą idiomu, takiego jak: d %>% group_by(year) %>% summarise(...)?

Odpowiedz

20

Oto kilka opcji

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

Albo może być (nie bardzo jasne w opisie)

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

Albo

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

Albo możemy użyć arrange aby zamówić " data "(jeśli nie jest zamówiona) i uzyskaj wartość last

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

W przypadku, chcesz spróbować z data.table, tutaj jest jeden

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

Albo jak @David Arenburg skomentował

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

@DavidArenburg To zabawne 'prawdziwe men' :-) – akrun

+0

@DavidArenburg Miałeś na myśli 'setorder (setDT (d), year, date) [, value [which.max (date)], year]'? – akrun

Powiązane problemy