我想将最近十年的一组日期列为最近,例如:
1922 --> 1920,
2099 --> 2090,
Run Code Online (Sandbox Code Playgroud)
等等
我希望我能在Lubridate做到这一点,如:
floor_date(1922, 'decade')
Run Code Online (Sandbox Code Playgroud)
但我得到:
Error in match.arg(unit) :
'arg' should be one of “second”, “minute”, “hour”, “day”, “week”, “month”, “year”
Run Code Online (Sandbox Code Playgroud)
有没有办法优雅地做到这一点,也许避免一堆if-else语句进行分箱,并希望避免一堆cuts进行分组?
MrF*_*ick 17
你可以在这里使用一些整数除法.看看每个数字进入几十年.
(c(1922, 2099) %/% 10) * 10
# [1] 1920 2090
Run Code Online (Sandbox Code Playgroud)
Eri*_*ski 14
在R到最近的十年:
将Modulus视为提取最右边数字并使用它从原始年份中减去的一种方法.1998年 - 8 = 1990年
> 1992 - 1992 %% 10
[1] 1990
> 1998 - 1998 %% 10
[1] 1990
Run Code Online (Sandbox Code Playgroud)
从R到最近十年的最高年份:
天花板就像地板一样,但加10.
> 1998 - (1998 %% 10) + 10
[1] 2000
> 1992 - (1992 %% 10) + 10
[1] 2000
Run Code Online (Sandbox Code Playgroud)
R中的一年到最近的十年:
整数除法将你的1998转换为199.8,舍入为整数为200,乘以10得到2000.
> round(1992 / 10) * 10
[1] 1990
> round(1998 / 10) * 10
[1] 2000
Run Code Online (Sandbox Code Playgroud)
floor_decade = function(value){ return(value - value %% 10) }
ceiling_decade = function(value){ return(floor_decade(value)+10) }
round_to_decade = function(value){ return(round(value / 10) * 10) }
print(floor_decade(1992))
print(floor_decade(1998))
print(ceiling_decade(1992))
print(ceiling_decade(1998))
print(round_to_decade(1992))
print(round_to_decade(1998))
Run Code Online (Sandbox Code Playgroud)
打印:
# 1990
# 1990
# 2000
# 2000
# 1990
# 2000
Run Code Online (Sandbox Code Playgroud)
资料来源:https: //rextester.com/AZL32693
不要害怕使用这个dob的胶带,这是将设备放在一起的唯一方法.
不能用于floor_date()整数;它适用于日期或日期时间对象。正如 MrFlick 的答案中已经建议的那样,您不需要 lubridate 来进行整数计算。如果你确实想使用 lubridate,可以这样做:
library(lubridate)
y <- ymd(c("2016-01-01", "2009-12-31"))
floor_date(y, years(10))
#> [1] "2010-01-01" "2000-01-01"
Run Code Online (Sandbox Code Playgroud)