格式化R中的小数位数


264

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

x <- 1.128347132904321674821

编辑:

指某东西的用途:

options(digits=2)

已被建议为可能的答案。有没有一种方法可以在脚本中指定一次以供使用?当我将其添加到脚本中时,它似乎并没有做任何不同的事情,并且我对重新格式化每个数字的格式不感兴趣(我正在自动处理一个非常大的报告)。

--

答案:舍入(x,数字= 2)



如果使用选项(数字= 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.from?options仅影响输出。
布兰登·贝特尔森

请注意,round(23, digits=2)将打印23而不是23.00。如果需要后者,请尝试stackoverflow.com/a/12135122/180892
Jeromy Anglim

4
@PaulHurleyuk,我认为在编程中最好使用尽可能少的库。对于每个琐碎的需求使用不同的库的人通常最终会陷入混乱,大文件,可移植性问题等
Rodrigo

Answers:


381

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

解决方案

以下代码恰好显示了该数字的两位小数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.00010.00
有用的

7
这一直困扰着我的功能怎么样format()prettyNum()改造NUMERICS成字符。您将如何解决?
Waldir Leoncio'Mar

出现的报价是什么?
F.Webber '17

2
@JeromyAnglim我注意到上面的解决方案可能存在边缘情况的缺点,即固定小数点前的字符数,例如 format(c(10, 1), nsmall=1)yields "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)。


虽然我不确定操作者到底在问什么,但从最高评分的答案来看,我忍不住观察到这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 '16

我比任何baseR函数都喜欢formattable。它的最大优点是将变量保留为数字。
拉撒路·瑟斯顿

22

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

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

这使

[1] "5.50"

就像@mpag在下面提到的那样,似乎R有时可以使用此方法给出意外的值,而round方法例如sprintf(5.5550,fmt ='%#。2f')给出5.55,而不是5.56


1
但是,尽管sprintf进行了四舍五入,但sprintf(5.5550,fmt ='%#。2f')给出了一个意外的结果:5.55。sprintf(5.555000000001,fmt ='%#。2f')得到5.56。这似乎是在R中进行四舍五入的一般“问题”,因为舍入nsmall方法给出了相同的结果。
mpag

感谢@mpag,我不知道R在边界上取整很费力,我只是用5.565进行了尝试,该函数可以四舍五入,而5.545可以四舍五入。我想这就是他们处理浮点精度的方式。我认为我没有在其他语言中看到过这种行为,我认为这意味着它们具有内置的解决方法
Mark Adamson

我认为他们是故意将值视作精度程度的限制。他们认为5.555的实际值与5.5554的“实际”值5.5546相同。但是,如果继续进行这种四舍五入游戏,则如果一次执行一位数,则5.444445可能(未经测试)最终显示为“ 6”。但是您可能是对的,这可能与二进制表示形式低于或高于5.55有关。
mpag

是的,我认为如果是有意的,则在5.565和5.545之间也会保持一致。“随机性”对我来说是一个浮点数表示法。
马克·亚当森

你们每个人都可以帮忙吗?stackoverflow.com/q/53279593/5224236
gpier

8

像这样:

options(digits=2)

数字定义选项:

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

运行脚本时,有什么方法可以动态设置此设置?
布兰登·贝特尔森

这适用于R控制台中的输出,但不适用于我的脚本(它们仍然带有.1289273982)
Brandon

1
我的行为很奇怪,该digits选项似乎未设置小数点后的位数。例如,当我设置options(digits = 2)时,打印7.25的结果为7.2,1234.25变为1234,而0.25则保留为0.25。有其他选择与此交互吗?
Maxim.K 2014年

8

检查函数prettyNum,格式

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


@ 42我提倡学习sprintf,它基本上是格式化的框架
jangorecki

1
@jangorecki我不确定你的意思。我所做的(5年前)只是建议进行拼写更正。
IRTFM

@ 42我拖欠您对fmtarg的投诉,对不起!
jangorecki 16'Mar

我认为OP在固定小数点后而不是固定数字后。g您的答案似乎是针对固定数字的,使用f效果更好。
Mark Adamson

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
谢谢保罗。这两个并不是我要找的东西,但是signif使我进入了round(),这正是我所需要的。干杯,
布兰登·贝特尔森

34
Error: could not find function "fixed"
ThomasH

signif适用于所提供的特定数字,但我认为常见的应用问题是当您需要精确显示两位小数但您不知道提前多少时。在这种情况下,signif将根据实际数字给出不同的小数位数。
Jeromy Anglim

3
在任何地方都找不到固定的。请修复它,否则此误导性答案应删除。
HelloWorld

@JeromyAnglim我们想要3sf时如何解决?有时它会给我3SF,其他时候是4SF,等等。我们该如何解决?
christouandr7

4

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



2

请注意,R中的数字对象以double precision进行存储,这使您(大约)具有16个十进制数字的精度-其余的将是噪声。我认为上面显示的数字可能仅是示例,但它的长度为22位。


3
确认,仅作为示例。我捣毁了键盘。
布兰登·贝特尔森

1

在我看来会像

library(tutoR)
format(1.128347132904321674821, 2)

每一点在线帮助


我找到了这个,但是它需要一个包装,我正在基本包装中寻找东西。
布兰登·贝特尔森

2
@ brandon,format()是基础的一部分。打开R并输入?format ...不需要软件包。
JD

嗯,你看得出的结果了吗?[1]“ 1.128347”否则,您认为它位于基本程序包中是正确的,我很糟糕。
布兰登·贝特尔森

1
也许format.default(x, digits = 2)可以根据提供的链接尝试 在黑暗中射击。该信息是我通常阅读的文档所缺乏的,我希望也能看到印刷输出。
Tim Meers 2010年

只是注意到您的链接指向tutoR文档,它不是基础的一部分。
布兰登·

1

如果您只想舍入一个数字或一个列表,只需使用

round(data, 2)

然后,数据将四舍五入到小数点后两位。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.