2015-05-17 31 views
9

Tôi có một tbl_df trông như thế này:dplyr - Nhận giá trị cuối cùng cho mỗi năm

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

nơi ngày dao động accross vài năm.

Tôi muốn nhận giá trị mới nhất là value cho mỗi năm (không phải lúc nào cũng là 31-12). Có cách nào để làm điều đó bằng cách sử dụng thành ngữ như: d %>% group_by(year) %>% summarise(...)?

Trả lời

20

Dưới đây là một số tùy chọn

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

Hoặc có thể (không phải là rất rõ ràng trong mô tả)

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

Hoặc

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

Hoặc chúng ta có thể sử dụng arrange ra lệnh ' ngày '(trong trường hợp không được đặt hàng) và nhận được giá trị last

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

Trong trường hợp, bạn muốn thử với data.table, đây là một trong

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

Hoặc như @ David Arenburg nhận xét

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

@DavidArenburg Đó là vui nhộn 'men' thực :-) – akrun

+0

@DavidArenburg Bạn có nghĩa là 'setorder (setDT (d), năm, ngày) [, value [which.max (date)], year]'? – akrun

Các vấn đề liên quan