1. ホーム
  2. r

[解決済み] 10(または100、X)未満を切り上げるには?

2022-05-17 11:28:13

質問

データをプロットする関数を書いています。私は、Y軸にきれいな丸い数を指定したいと思います。 max に、データセットの最大値よりも大きな丸い数値を指定したいのですが。

具体的には、関数 foo を実行するような関数が欲しい。

foo(4) == 5
foo(6.1) == 10 #maybe 7 would be better
foo(30.1) == 40
foo(100.1) == 110 

までたどり着きました。

foo <- function(x) ceiling(max(x)/10)*10

は10に最も近い値への丸め用ですが、これは任意の丸め間隔では動作しません。

Rでこれを行う良い方法はありますか?

どのように解決するのですか?

10の累乗に切り上げたいだけなら、定義するだけです。

roundUp <- function(x) 10^ceiling(log10(x))

これは実はxがベクトルである場合にも有効です。

> roundUp(c(0.0023, 3.99, 10, 1003))
[1] 1e-02 1e+01 1e+01 1e+04

...しかし、もしあなたが "nice" 数に丸めたいのであれば、まず "nice" 数が何であるかを定義する必要があります。以下では、"nice" を 1 から 10 までの nice 基底値を持つベクトルとして定義することができます。デフォルトでは、偶数に5を足した値に設定されています。

roundUpNice <- function(x, nice=c(1,2,4,5,6,8,10)) {
    if(length(x) != 1) stop("'x' must be of length 1")
    10^floor(log10(x)) * nice[[which(x <= 10^floor(log10(x)) * nice)[[1]]]]
}

xがベクトルの場合、上記はうまくいきません。)

> roundUpNice(0.0322)
[1] 0.04
> roundUpNice(3.22)
[1] 4
> roundUpNice(32.2)
[1] 40
> roundUpNice(42.2)
[1] 50
> roundUpNice(422.2)
[1] 500

[編集]]する

もし質問が指定された最も近い値(10や100など)に丸める方法であるなら、ジェームス と答えます。 が最も適切だと思います。私のバージョンでは、任意の値を取って、自動的に合理的な "nice"値に丸めることができます。上記の"nice"ベクトルの他の良い選択はいくつかあります。 1:10, c(1,5,10), seq(1, 10, 0.1)

もし、プロットの中に値の範囲がある場合、例えば [3996.225, 40001.893] のような値の範囲がある場合、自動的な方法は範囲の大きさと数値の大きさの両方を考慮する必要があります。そして、例えば が指摘したように、ハドレー は、その pretty() 関数は、あなたが望むものであるかもしれません。