Rでの小数位のフォーマット


264

画面に出力する(またはファイルに書き込む)ときに、小数点以下2桁のみとして表示したい1.128347132904321674821などの数値があります。どうやってそれを行うのですか?

x <- 1.128347132904321674821

編集:

の用法:

options(digits=2)

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

-

回答:丸め(x、桁数= 2)



options(digits = 4)を使用すると、計算は4桁に制限されませんか?その場合、プログラムの精度が大幅に低下します。印刷時にのみ影響しますよね?
MikeZ

controls the number of digits to print when printing numeric values. It is a suggestion only. Valid values are 1...22 with default 7. See the note in print.default about values greater than 15.?optionsからは、出力のみに影響します。
Brandon Bertelsen、2012

round(23, digits=2)印刷されません。後者が必要な場合は、stackoverflow.com2323.00
a / 12135122/180892

4
@PaulHurleyuk、できるだけ少ない数のライブラリーを使用することがプログラミングの良い習慣だと思います。ささいな必要性ごとに異なるライブラリを使用する人は、通常、混乱、大きなファイル、移植性の問題などに終わります
Rodrigo

回答:


381

背景:このページに提案いくつかの答えは、(例えば、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"

4
私のために働いた1唯一の答えは、正しく印刷さ0.0001など0.00
ThomasH

7
関数がどのように機能しformat()prettyNum()数値を文字に変換するかは常に悩まされます。これにどのように対処しますか?
Waldir Leoncio

表示される引用とは何ですか?
F.Webber 2017年

2
上記溶液は小数点の前の文字の数を固定することも可能エッジ・ケースの欠点を持っていることを@JeromyAnglim Iノート、例えば format(c(10, 1), nsmall=1)収率は"10.0" " 1.0"(1.0の前に先頭のスペースに注意してください。、一方sprintf()の機能がオンに書式設定よりよい保証に思えます例えば、小数点の両側は、sprintf(c(10,1), fmt = '%#.1f')その厄介な先頭のスペースとリターンを取り除きます"10.0" "1.0"
ニコラス・G・ライヒを

1
先頭のスペースは、結果がformat列で使用されるときに小数点を揃えるように設計された機能です。
住民

34

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

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

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


最高評価の回答から判断して、OPが何を求めているのか正確にはわかりませんが、私がformatCこの目的のために使用するものはほぼ完全にそれであることに気づかざるを得ません。この答えは良いと思いますし、OPの要求によるベースRにあります。
AdamO

これを手伝ってくれる人はいますか?stackoverflow.com/q/53279593/5224236
gpier

24

私のパッケージの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

そのような小さな小さな刺し傷は、私に朝から悩まされています。何らかの理由で、Rは一部の列のみの表示を切り上げます。これらの列でも計算を実行する必要があったため、この修正が必要でした。これは機能します。よろしくお願いします!
thethakuri 2016年

どのbaseR関数よりもformattableが好きです。最大の利点は、変数を数値として保持することです。
Lazarus Thurston、

22

後続ゼロを保持したいと仮定した場合の小数点以下2桁

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

与える

[1] "5.50"

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


1
ただし、sprintfは丸めますが、sprintf(5.5550、fmt = '%#。2f')は少し予期しない結果になります:5.55。sprintf(5.555000000001、fmt = '%#。2f')は5.56を返します。これは、Rでの丸めに関する一般的な「問題」であると思われます。これは、丸めnsmallメソッドでも同じことができるためです。
mpag 2018年

@mpagに感謝します。Rが境界の丸めに苦労しているとは思いませんでした。5.565で切り上げ、5.545で切り捨てたところです。それは彼らが浮動小数点の不正確さを処理している方法だと思います。他の言語でこの動作を見たことはないと思いますが、これは組み込みの回避策があることを意味します
Mark Adamson

むしろそれらは意図的に値を精度の程度に制限があるものとして扱っていると思います。彼らは、5.555の値が5.5546の「実際の」値から生じた可能性が5.5554と同じくらいであると考えています。ただし、そのような丸めゲームを続ける場合、一度に1桁ずつ実行すると、5.444445は(予測されない)「6」になる可能性があります。しかし、バイナリ表現が5.55より少し下か上であることは問題ではないかもしれません。
mpag

ええ、私はそれが意図的だった場合、5.565と5.545の間でも一貫していると思います。「ランダム性」は、浮動小数点表現であることを示唆しています。
マークアダムソン2018

これを手伝ってくれる人はいますか?stackoverflow.com/q/53279593/5224236
gpier

8

そんな感じ :

options(digits=2)

桁オプションの定義:

digits: controls the number of digits to print when printing numeric values.

スクリプトを実行するときにこれを動的に設定する方法はありますか?
Brandon Bertelsen 2010

これはRコンソール内での出力には機能しますが、私のスクリプト内では機能しません(.1289273982でまだ出力されています)
Brandon Bertelsen

1
私は奇妙な振る舞いをしdigitsます、オプションは小数の後の桁数を設定しないようです。たとえば、オプション(数字= 2)を設定すると、7.25を出力すると7.2が出力され、1234.25は1234になり、0.25は0.25のままになります。これと相互作用する別のオプションはありますか?
Maxim.K

8

関数prettyNum、フォーマットをチェック

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


@ 42私は学ぶsprintfことをお
勧め

1
@jangorecki私はあなたの要点を知りません。私が行ったすべて(5年以上前)は、スペル修正を提案することでした。
IRTFM 2016年

@ 42 fmtargに文句を言うのはごめんなさい、ごめんなさい!
jangorecki 2016年

OPは、固定された桁数ではなく、固定小数点以下の桁数の後にあると思います。gあなたの答えは固定数字用のようです、使用fするとうまくいきます。
マークアダムソン2018年

5

固定数字よりも有効数字を好む場合は、signifコマンドが役立ちます。

> signif(1.12345, digits = 3)
[1] 1.12
> signif(12.12345, digits = 3)
[1] 12.1
> signif(12345.12345, digits = 3)
[1] 12300

1
ポールに感謝します。これら2つは私が探していたものとは厳密には一致しませんでしたが、signifによって、私がちょうど必要とするround()に導かれました。乾杯、
Brandon Bertelsen 2010

34
Error: could not find function "fixed"
ThomasH

signif提供された特定の数値で機能しますが、一般的に適用される問題は、小数点以下2桁を正確に表示する必要があるが、数値が事前にわからない場合です。その場合、signif実際の数値に応じて異なる小数点以下の桁数が表示されます。
Jeromy Anglim

3
fixedはどこにも見つかりません。修正してください。修正しない場合、この誤解を招く答えを削除する必要があります。
HelloWorld 2016

@JeromyAnglim 3sfが欲しいときにどうやって修正するの?時にはそれは私に3sfを与え、他の場合は4sfなどを与えます。
christouandr7

4

この関数formatC()は、数値を小数点以下2桁にフォーマットするために使用できます。結果の値に後続ゼロが含まれている場合でも、この関数によって小数点以下2桁が与えられます。


3

私はKの小数点以下の桁数を強制的に出力するためにこのバリアントを使用しています:

# format numeric value to K decimal places
formatDecimal <- function(x, k) format(round(x, k), trim=T, nsmall=k)

2

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


3
確認されました。これは単なる例です。キーボードをつぶした。
Brandon Bertelsen

1

私のように見えるのは次のようなものです

library(tutoR)
format(1.128347132904321674821, 2)

少しのオンラインヘルプあたり


これを見つけましたが、パッケージが必要です。基本パッケージ内で何かを探しています。
Brandon Bertelsen

2
@ brandon、format()はベースの一部です。Rを開き、?format ...と入力します。パッケージは不要です。
JD Long

うーん、これが何を出力するか見ましたか?[1]「1.128347」それ以外の場合は、ベースパッケージに含まれていることは間違いありません。
Brandon Bertelsen、2010

1
おそらくformat.default(x, digits = 2)、提供されたリンクに基づいて、暗闇の中でただのショットを試してください 。その情報は、私が通常ドキュメントを読むのに欠けているものであり、私は印刷された出力も見ると期待していました。
Tim Meers

リンクが、ベースの一部ではないtutoRのドキュメントを指していることに注意してください。
Brandon Bertelsen、2010

1

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

round(data, 2)

その後、データは小数点以下2桁に丸められます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.