R一年到十年

Mon*_*eck 18 r date lubridate

我想将最近十年的一组日期列为最近,例如:

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)

  • 或类似地`x - (x %% 10)`. (10认同)

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的胶带,这是将设备放在一起的唯一方法.

  • 值得注意的是,“round”的第二个参数为负数,因此您的示例“round(1992 / 10) * 10”也可以通过“round(1992, -1)”来实现。 (2认同)

yut*_*ion 5

不能用于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)