Пол в год до десятилетия в 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 чтобы сделать группировку?

Ответ 1

Пол года в 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, округленное до целого 200, умножьте это на 10, чтобы вернуться к 2000.

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

Удобная копировальная паста для тех, кто не любит думать:

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

который печатает:

# 1990
# 1990
# 2000
# 2000
# 1990
# 2000

Источник: https://rextester.com/AZL32693

Не стесняйтесь клейкой ленты с этой док-станцией, это единственное, что удерживает устройство вместе.

Ответ 2

Здесь вы можете просто использовать целое подразделение. Просто посмотрите, сколько десятилетий входит в каждый номер.

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

Ответ 3

Вы не можете использовать 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"

Ответ 4

Вы также можете использовать функцию floor следующим образом:

floor(1922 / 10) * 10

Если вам нужно округлить, а не пол:

round(1922, digits = -1)