325

画面に出力する(またはファイルに書き込む)ときに小数点以下2桁だけで表示したい番号、たとえば1.128347132904321674821があります。どのようにそれを行うのですか?

x <- 1.128347132904321674821

編集:

の用法:

options(digits=2)

考えられる答えとして提案されています。一度だけ使用するためにスクリプト内でこれを指定する方法はありますか?スクリプトに追加しても何も変わらないようで、各数値をフォーマットするために多くの再入力することに興味はありません(非常に大きなレポートを自動化しています)。

-

回答:round(x、digits = 2)

4

14 に答える 14

462

背景:このページで提案されているいくつかの回答(たとえば、signifoptions(digits=...)は、任意の数に対して特定の小数点以下の桁数が表示されることを保証するものではありません。これはRの設計上の特徴であり、優れた科学的実践には「有効数字」の原則に基づいて特定の桁数を表示することが含まれると思います。ただし、多くのドメイン(APAスタイル、ビジネスレポートなど)では、フォーマット要件により、特定の小数点以下の桁数を表示する必要があります。これは、有効数字に関係するのではなく、一貫性と標準化の目的で行われることがよくあります。

解決策

次のコードは、数値の小数点以下2桁を正確に示していますx

format(round(x, 2), nsmall = 2)

例えば:

format(round(1.20, 2), nsmall = 2)
# [1] "1.20"
format(round(1, 2), nsmall = 2)
# [1] "1.00"
format(round(1.1234, 2), nsmall = 2)
# [1] "1.12"

より一般的な関数は次のとおりです。ここxで、は数値で、kは表示する小数点以下の桁数です。trimws数値のベクトルがある場合に役立つ可能性のある先頭の空白を削除します。

specify_decimal <- function(x, k) trimws(format(round(x, k), nsmall=k))

例えば、

specify_decimal(1234, 5)
# [1] "1234.00000"
specify_decimal(0.1234, 5)
# [1] "0.12340"

代替案の議論:

formatCの回答とsprintfの回答はかなりうまく機能します。ただし、望ましくない場合がある場合は、負のゼロが表示されます。つまり、

formatC(c(-0.001), digits = 2, format = "f")
# [1] "-0.00"
sprintf(-0.001, fmt = '%#.2f')
# [1] "-0.00"

これに対する1つの可能な回避策は、次のとおりです。

formatC(as.numeric(as.character(round(-.001, 2))), digits = 2, format = "f")
# [1] "0.00" 
于 2012-08-27T00:43:11.267 に答える
47

x必要に応じて、小数点以下までの数値をフォーマットできます。x小数点以下の桁数が多い数字です。この数値の小数点以下8桁までを表示したいとします。

x = 1111111234.6547389758965789345
y = formatC(x, digits = 8, format = "f")
# [1] "1111111234.65473890"

ここでformat="f"は、通常の小数点以下の桁数xxx.xxxに浮動小数点数をdigits指定し、桁数を指定します。対照的に、表示する整数を取得したい場合は、format="d"(のようにsprintf)を使用します。

于 2016-03-16T11:36:58.610 に答える
34

あなたは私のパッケージformattableを試すことができます。

> # devtools::install_github("renkun-ken/formattable")
> library(formattable)
> x <- formattable(1.128347132904321674821, digits = 2, format = "f")
> x
[1] 1.13

良い点は、xそれでも数値ベクトルであり、同じフォーマットでより多くの計算を実行できることです。

> x + 1
[1] 2.13

さらに良いことに、数字は失われません。いつでもより多くの数字で再フォーマットできます:)

> formattable(x, digits = 6, format = "f")
[1] 1.128347
于 2015-05-29T08:09:04.853 に答える
32

末尾のゼロを維持したい場合は、小数点以下2桁まで

sprintf(5.5, fmt = '%#.2f')

これは

[1] "5.50"

@mpagが以下で言及するように、Rはこれで予期しない値を与えることがあり、たとえばsprintf(5.5550、fmt ='%#。2f')は5.56ではなく5.55を与えるようです。

于 2018-01-15T14:53:29.673 に答える
11

固定数字よりも有効数字を使用する場合は、signifコマンドが役立つ場合があります。

> signif(1.12345, digits = 3)
[1] 1.12
> signif(12.12345, digits = 3)
[1] 12.1
> signif(12345.12345, digits = 3)
[1] 12300
于 2010-08-09T20:31:40.967 に答える
10

そんな感じ :

options(digits=2)

数字オプションの定義:

digits: controls the number of digits to print when printing numeric values.
于 2010-08-09T20:04:28.880 に答える
9

関数prettyNum、フォーマットを確認してください

試行ゼロ(たとえば123.1240)を使用するにはsprintf(x, fmt='%#.4g')

于 2010-08-09T20:04:49.780 に答える
6

この関数formatC()を使用して、数値を小数点以下2桁にフォーマットできます。結果の値に末尾のゼロが含まれている場合でも、この関数によって小数点以下2桁が指定されます。

于 2013-04-26T21:13:16.183 に答える
4

私はこのバリアントを小数点以下K桁の強制印刷に使用しています。

# format numeric value to K decimal places
formatDecimal <- function(x, k) format(round(x, k), trim=T, nsmall=k)
于 2014-04-14T03:30:07.377 に答える
3

Rの数値オブジェクトは倍精度で格納されることに注意してください。これにより、(おおよそ)16桁の精度が得られます。残りはノイズになります。上記の数字はおそらく一例ですが、22桁の長さです。

于 2010-08-10T05:01:06.143 に答える
2

私には次のようなものになりたいように見えます

library(tutoR)
format(1.128347132904321674821, 2)

少しのオンラインヘルプごとに。

于 2010-08-09T20:02:17.970 に答える
1

数値またはリストを丸めるだけの場合は、単に

round(data, 2)

その後、データは小数点第2位に四捨五入されます。

于 2018-07-05T04:04:46.080 に答える
0

これがユニットから数百万への私のアプローチです。桁パラメータを使用すると、重要な値の最小数(整数+小数)を調整できます。最初に内部の小数の丸めを調整できます。

number <-function(number){
  result <- if_else(
    abs(number) < 1000000,
    format(
      number, digits = 3,
      big.mark = ".",
      decimal.mark = ","
    ),
    paste0(
      format(
        number/1000000,
        digits = 3,
        drop0trailing = TRUE,
        big.mark = ".",
        decimal.mark = ","
      ),
      "MM"
    )
  )
  # result <- paste0("$", result)
  return(result)
}
于 2020-11-27T17:21:40.000 に答える
0

私はこの関数を作成しましたが、これは改善される可能性がありますが、コーナーケースではうまく機能するように見えます。たとえば、0.9995の場合、投票の正解は1.00になりますが、これは正しくありません。数値に小数点がない場合にそのソリューションを使用します。

round_correct <- function(x, digits, chars = TRUE) {
  if(grepl(x = x, pattern = "\\.")) {
    y <- as.character(x)
    pos <- grep(unlist(strsplit(x = y, split = "")), pattern = "\\.", value = FALSE)
    if(chars) {
      return(substr(x = x, start = 1, stop = pos + digits))
    }
    return(
      as.numeric(substr(x = x, start = 1, stop = pos + digits))
    )
  } else {
    return(
      format(round(x, 2), nsmall = 2)
    )
  }
}

例:

round_correct(10.59648, digits = 2)
[1] "10.59"
round_correct(0.9995, digits = 2)
[1] "0.99"
round_correct(10, digits = 2)
[1] "10.00"
于 2021-04-08T02:17:17.153 に答える