web-dev-qa-db-ja.com

Rで1年から10年のフロア

一連の日付を最も近い10年にフロア化したいと思います。例:

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ステートメントを回避し、できればグループ化を行うための一連のcutsを回避しますか?

20
Monica Heddneck

Rで1年を最も近い10年まで:

Modulusは、右端の桁を抽出し、それを使用して元の年から減算する方法と考えてください。 1998-8 = 1990

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

Rで1年を最も近い10年にまとめる:

天井は床とまったく同じですが、10を追加します。

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

Rで1年を最も近い10年に丸めます:

整数除算は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/AZL3269

このドブでダクトテープを恥ずかしがらないでください、それはユニットを一緒に保持する唯一のものです。

14
Eric Leschinski

ここでは整数除算を使用できます。それぞれの数字に何十年かかるかを見てください。

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

整数に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"
2
yutannihilation

次のような床関数を使用することもできます。

floor(1922 / 10) * 10
# [1] 1920

床ではなく丸くする必要がある場合:

round(1922, digits = -1)
# [1] 1920
2