2016-02-12 60 views
13

十年,我想樓一組日期到最近的十年中,如:樓一年中的R

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

我希望我能在Lubridate做到這一點,如:

floor_date(1922, 'decade') 

,但我得到:

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

有什麼辦法可以優雅地做到這一點,或許可以避免一堆if-else語句來做分檔,並希望避免一堆cut來做分組?

回答

2

樓一年中的R到最近的十年:

模看作一種方式提取最右邊的數字並將其用於從原始年份中減去。 1998 - 8 = 1990

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

天花板一年中的R到最近十年:

天花板酷似的地板,但添加10

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

回合中的R一年到最接近的十年:

整數除法將您的1998年轉換爲199.8,舍入爲整數爲20 0,乘以10回到2000.

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

你可以在這裏使用一些整數除法。只要看看每個數字有多少十年。

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

或者類似的'x - (x %% 10)'。 – thelatemail

0

對於整數,您不能使用floor_date();它用於日期或日期時間對象。正如MrFlick的回答中所建議的,您不需要進行整數計算。如果你想使用lubridate,這是可以做到這樣的事:


library(lubridate) 

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

好點。謝謝。 –