2016-02-12 13 views
13

Tôi muốn sàn một bộ ngày để các thập kỷ gần nhất, ví dụ:Tầng một năm để thập kỷ trong R

1922 --> 1920, 
2099 --> 2090, 

, vv

Tôi đã hy vọng tôi có thể làm điều này trong Lubridate, như trong:

floor_date(1922, 'decade') 

Nhưng tôi nhận được:

Error in match.arg(unit) : 
    'arg' should be one of “second”, “minute”, “hour”, “day”, “week”, “month”, “year” 

Có cách nào để làm điều này một cách duyên dáng, có lẽ tránh một loạt các tuyên bố if-else để làm binning, và hy vọng tránh một bó của cut s để làm các nhóm?

Trả lời

2

Tầng một năm trong R để thập kỷ gần nhất:

Hãy suy nghĩ về Modulus như một cách để trích xuất các chữ số ngoài cùng bên phải và sử dụng nó để trừ đi từ năm gốc. Năm 1998 - 8 = 1990

> 1992 - 1992 %% 10 
[1] 1990 
> 1998 - 1998 %% 10 
[1] 1990 

trần một năm trong R để thập kỷ gần nhất:

trần hoàn toàn giống với sàn, nhưng thêm 10.

> 1998 - (1998 %% 10) + 10 
[1] 2000 
> 1992 - (1992 %% 10) + 10 
[1] 2000 

Vòng một năm trong R đến thập kỷ gần nhất:

Phân tách số nguyên chuyển đổi từ 1998 sang 199.8, được làm tròn thành số nguyên là 20 0, nhân với 10 để quay lại năm 2000.

> round(1992/10) * 10 
[1] 1990 
> round(1998/10) * 10 
[1] 2000 
17

Bạn chỉ có thể sử dụng một số phân chia số nguyên tại đây. Chỉ cần xem có bao nhiêu thập kỷ đi vào mỗi số.

(c(1922, 2099) %/% 10) * 10 
# [1] 1920 2090 
+10

Hoặc tương tự 'x - (x %% 10)'. – thelatemail

0

Bạn không thể sử dụng floor_date() cho số nguyên; nó dành cho các đối tượng ngày tháng hoặc ngày giờ. Như đã đề xuất trong câu trả lời của MrFlick, bạn không cần lubridate để tính toán số nguyên. Nếu bạn muốn sử dụng lubridate, nó có thể được thực hiện một cái gì đó như thế này:


library(lubridate) 

y <- ymd(c("2016-01-01", "2009-12-31")) 
floor_date(y, years(10)) 
#> [1] "2010-01-01" "2000-01-01" 
+0

điểm tốt. Cảm ơn. –

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