格式化R中的小数位数

Bra*_*sen 238 formatting r rounding r-faq

我有一个数字,例如1.128347132904321674821,我想在输出到屏幕(或写入文件)时只显示两位小数.怎么做到这一点?

x <- 1.128347132904321674821
Run Code Online (Sandbox Code Playgroud)

编辑:

指某东西的用途:

options(digits=2)
Run Code Online (Sandbox Code Playgroud)

已被建议作为可能的答案.有没有办法在脚本中指定一次性使用?当我将它添加到我的脚本时,它似乎没有做任何不同的事情,我对很多重新键入格式化每个数字感兴趣(我正在自动化一个非常大的报告).

-

答案:round(x,digits = 2)

Jer*_*lim 352

背景:本网页上提出了一些答案(例如signif,options(digits=...)),不保证显示为任意数量的小数一定数量.我认为这是R中的一个设计特征,其中良好的科学实践涉及根据" 重要数字 "的原则显示一定数量的数字.但是,在许多域(例如,APA样式,业务报告)中,格式要求规定显示一定数量的小数位.这通常是为了一致性和标准化目的而不是关注重要数据.

方案:

以下代码显示该数字的正好两位小数x.

format(round(x, 2), nsmall = 2)
Run Code Online (Sandbox Code Playgroud)

例如:

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"
Run Code Online (Sandbox Code Playgroud)

更一般的功能如下,其中x是数字,k是要显示的小数位数.trimws删除任何前导空白区域,如果您有一个数字向量,这可能很有用.

specify_decimal <- function(x, k) trimws(format(round(x, k), nsmall=k))
Run Code Online (Sandbox Code Playgroud)

例如,

specify_decimal(1234, 5)
# [1] "1234.00000"
specify_decimal(0.1234, 5)
# [1] "0.12340"
Run Code Online (Sandbox Code Playgroud)

  • 像`format()`和`prettyNum()`这样的函数如何将数字转换成字符一直困扰着我.你会如何解决这个问题? (7认同)
  • +1只有对我有用的答案,正确打印`0.0001`为'0.00` (4认同)
  • 前导空格是一项设计用于在列中使用“format”结果时对齐小数点的功能。 (4认同)
  • @JeromyAnglim 我注意到上面的解决方案有一个可能的边缘情况缺点,即修复小数点前面的字符数,例如 `format(c(10, 1), nsmall=1)` 产生 `"10.0" " 1.0 "`(注意 1.0 前面的前导空格。然而,`sprintf()` 函数似乎保证了小数两边更好的格式,例如 `sprintf(c(10,1), fmt = '%# .1f')` 去掉那个讨厌的前导空格并返回 `"10.0" "1.0"`。 (2认同)

SOR*_*JON 30

您可以根据需要格式化数字,例如x,最多小数位数.这x是一个带有许多小数位的数字.假设我们希望显示此数字的最多8个小数位:

x = 1111111234.6547389758965789345
y = formatC(x, digits = 8, format = "f")
# [1] "1111111234.65473890"
Run Code Online (Sandbox Code Playgroud)

这里format="f"给出了通常的小数位,例如xxx.xxx中的浮点数,并digits指定了位数.相比之下,如果你想得到一个整数来显示你会使用format="d"(很像sprintf).

  • 虽然我不清楚OP到底在问什么,但从评分最高的答案来看,我忍不住观察到“formatC”几乎是我专门用于此目的的。我认为这个答案很好,并且根据OP的要求以R为基础。 (2认同)

Kun*_*Ren 22

您可以尝试我的包格式表.

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

好处是,x仍然是一个数字向量,您可以使用相同的格式进行更多的计算.

> x + 1
[1] 2.13
Run Code Online (Sandbox Code Playgroud)

更好的是,数字不会丢失,您可以随时重新格式化更多数字:)

> formattable(x, digits = 6, format = "f")
[1] 1.128347
Run Code Online (Sandbox Code Playgroud)

  • 与任何 baseR 函数相比,我更喜欢 formattable。最大的优点是将变量保留为数字。 (3认同)

Mar*_*son 17

假设您要保留尾随零,则为2位小数

sprintf(5.5, fmt = '%#.2f')
Run Code Online (Sandbox Code Playgroud)

这使

[1] "5.50"
Run Code Online (Sandbox Code Playgroud)

正如下面@mpag提到,似乎ř有时可以得到意想不到的值与此和圆方法例如sprintf的(5.5550,FMT ="%#.2F")给出了5.55,而不是5.56


ily*_*lya 7

检查函数prettyNum,格式

使用trialling零(例如123.1240) sprintf(x, fmt='%#.4g')


Xav*_* V. 6

像这样:

options(digits=2)
Run Code Online (Sandbox Code Playgroud)

数字定义选项:

digits: controls the number of digits to print when printing numeric values.
Run Code Online (Sandbox Code Playgroud)

  • 我得到一个奇怪的行为,`digits` 选项似乎没有设置小数点后的位数。例如,当我设置 options(digits = 2) 时,打印 7.25 会导致输出 7.2,1234.25 变为 1234,而 0.25 仍为 0.25。是否有另一种选择与此交互? (2认同)

Che*_*off 6

该函数formatC()可用于将数字格式化为两位小数。即使结果值包含尾随零,此函数也会给出两个小数位。


Pau*_*yuk 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
Run Code Online (Sandbox Code Playgroud)

  • 错误:找不到功能“固定” (34认同)
  • 在任何地方都找不到固定的。请修复它,否则此误导性答案应删除。 (3认同)