x <- 1.128347132904321674821
编辑:
使用:
options(digits=2)
建议作为可能的答案。有没有一种方法可以在脚本中指定一次以供使用?当我将其添加到脚本中时,它似乎并没有做任何不同的事情,并且我对重新格式化每个数字的格式不感兴趣(我正在自动处理一个非常大的报告)。
-
答案:round(x,digits = 2)
#1 楼
背景:此页面上建议的某些答案(例如signif
,options(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"
评论
+1只对我有用的答案,将0.0001正确打印为0.00
– ThomasH
2012年12月6日在17:42
总是困扰我的是诸如format()和prettyNum()之类的函数如何将数字转换为字符。您将如何解决?
– Waldir Leoncio
15年3月6日在14:19
出现的报价是什么?
– F.Webber
17年5月31日在16:14
@JeromyAnglim我注意到上面的解决方案可能存在边缘情况的缺点,即固定小数点前的字符数,例如format(c(10,1),nsmall = 1)产生“ 10.0”“ 1.0”(请注意1.0的前导空格。而sprintf()函数似乎可以保证小数点两侧的格式更好,例如sprintf(c(10,1),fmt ='%#。1f')摆脱了那个讨厌的前导空间,并返回“ 10.0”“ 1.0”。
–尼古拉斯·G·赖希(Nicholas G Reich)
18-10-31在15:42
前导空格是一种用于在列中使用格式结果时对齐小数点的功能。
–居民
19年5月25日在15:29
#2 楼
您可以根据需要设置数字格式,例如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
17-12-27在20:42
你们每个人都可以帮忙吗? stackoverflow.com/q/53279593/5224236
– CatalystRPA
18年11月13日在20:50
#3 楼
您可以尝试使用我的包格式表。> # 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-10-7在7:24
我比任何baseR函数都喜欢formattable。它的最大优点是将变量保留为数字。
–拉撒路·瑟斯顿(Lazarus Thurston)
19-10-16在14:54
#4 楼
假设要保留尾随零作为小数点后2位sprintf(5.5, fmt = '%#.2f')
给出
[1] "5.50"
与@ mpag在下面提到,似乎R有时可以使用this和round方法给出意外的值,例如sprintf(5.5550,fmt ='%#。2f')给出5.55,而不是5.56
评论
但是,尽管sprintf进行了四舍五入,但sprintf(5.5550,fmt ='%#。2f')给出了一个意外的结果:5.55。 sprintf(5.555000000001,fmt ='%#。2f')得到5.56。这似乎是在R中进行四舍五入的一般“问题”,因为舍入nsmall方法给出了相同的结果。
–mpag
18-3-23在18:22
感谢@mpag,我不知道R在边界上取整很费力,我只是用5.565进行了尝试,该函数可以四舍五入,而5.545可以四舍五入。我想这就是他们处理浮点精度的方式。我认为我没有在其他语言中看到过这种行为,我想这意味着它们具有内置的解决方法
–马克·亚当森
18-3-24在21:32
我认为他们是故意将值视作精度程度的限制。他们认为5.555的实际值与5.5554的“实际”值5.5546相同。但是,如果继续进行这种四舍五入游戏,则如果一次执行一位数,则5.444445可能(未经测试)最终显示为“ 6”。但是您可能是对的,因为二进制表示形式可能低于或高于5.55。
–mpag
18 Mar 25 '18在21:06
是的,我认为如果是有意的,则在5.565和5.545之间也将保持一致。 “随机性”对我来说是一个浮点数表示法。
–马克·亚当森
18年4月5日在11:48
你们每个人都可以帮忙吗? stackoverflow.com/q/53279593/5224236
– CatalystRPA
18年11月13日在20:50
#5 楼
像这样的东西:options(digits=2)
数字的定义选项:
digits: controls the number of digits to print when printing numeric values.
评论
运行脚本时,有什么方法可以动态设置此设置?
–布兰登·贝特尔森(Brandon Bertelsen)
2010年8月9日在20:23
这适用于R控制台中的输出,但不适用于我的脚本(它们仍然带有.1289273982)
–布兰登·贝特尔森(Brandon Bertelsen)
2010年8月9日在20:48
我有一个奇怪的行为,digits选项似乎没有设置小数点后的位数。例如,当我设置options(digits = 2)时,则打印7.25会导致输出7.2,1234.25变为1234,而0.25则保持0.25。是否有其他选择与此交互?
–Maxim.K
2014年9月22日在8:20
#6 楼
检查函数prettyNum,格式为以具有试验零(例如123.1240),请使用
sprintf(x, fmt='%#.4g')
评论
@ 42我会提倡学习sprintf,它基本上是格式化框架
– jangorecki
16年3月24日在20:40
@jangorecki我不确定你的意思。我所做的(5年前)只是建议进行拼写更正。
– IRTFM
16 Mar 24 '16 at 20:49
@ 42我要你在fmt arg上抱怨,对不起!
– jangorecki
16 Mar 24 '22 at 22:24
我认为OP在固定小数点后而不是固定数字后。您的答案中的g似乎是固定数字,使用f效果更好。
–马克·亚当森
18年3月4日在16:29
#7 楼
如果您更希望使用有效数字而不是固定数字,那么signif命令可能会有用:> signif(1.12345, digits = 3)
[1] 1.12
> signif(12.12345, digits = 3)
[1] 12.1
> signif(12345.12345, digits = 3)
[1] 12300
评论
谢谢保罗。这两个并不是我要找的东西,但是signif使我进入了round(),这正是我所需要的。干杯,
–布兰登·贝特尔森(Brandon Bertelsen)
2010年8月9日在21:17
错误:找不到功能“已修复”
– ThomasH
2012年12月6日17:40
signif适用于所提供的特定数字,但我认为常见的应用问题是何时需要精确显示两位小数,但您不知道提前多少。在这种情况下,signif将根据实际数字给出不同的小数位数。
–杰里姆·安格利
2012年12月7日在4:57
在任何地方都找不到固定的。请修复它,否则应删除此误导性答案。
–小型国际象棋
16-4-24在12:33
@JeromyAnglim我们想要3sf时如何解决?有时它给我3sf,其他时候给我4sf,等等。我们该如何解决?
–christouandr7
3月28日12:06
#8 楼
功能formatC()
可用于将数字格式化为两位小数。即使结果值包含尾随零,此函数也会给出小数点后两位。#9 楼
我将此变量用于强制打印K个小数位:# format numeric value to K decimal places
formatDecimal <- function(x, k) format(round(x, k), trim=T, nsmall=k)
#10 楼
请注意,R中的数字对象以双精度存储,这使您(大约)具有16个十进制数字的精度-其余的将是噪声。我认为上面显示的数字可能仅是示例,但它的长度为22位。评论
确认,仅作为示例。我捣毁了键盘。
–布兰登·贝特尔森(Brandon Bertelsen)
2010年8月10日在16:46
#11 楼
在我看来,应该有点像library(tutoR)
format(1.128347132904321674821, 2)
每一点在线帮助。
评论
我找到了这个,但是它需要一个包装,我正在基本包装中寻找东西。
–布兰登·贝特尔森(Brandon Bertelsen)
2010年8月9日20:19
@ brandon,format()是基础的一部分。打开R并输入?format ...不需要软件包。
–JD Long
2010年8月9日在20:38
嗯,你看得出的结果了吗? [1]“ 1.128347”否则,您认为它位于基本程序包中是正确的,我很糟糕。
–布兰登·贝特尔森(Brandon Bertelsen)
2010年8月10日在1:24
也许尝试format.default(x,digits = 2)只是在黑暗中一枪,尽管基于提供的链接。该信息是我通常在阅读文档时所缺少的,我希望也能看到印刷输出。
– Tim Meers
2010年8月10日在14:08
刚刚注意到,您的链接指向tutoR文档,该文档不属于基础。
–布兰登·贝特尔森(Brandon Bertelsen)
2010年8月10日17:09
#12 楼
如果只想四舍五入一个数字或一个列表,只需使用round(data, 2)
,那么数据将四舍五入到小数点后两位。
#13 楼
这是我从单位到数百万的方法。digits参数使我可以调整有效值的最小数量(整数+小数)。您可以先在内部调整小数舍入。
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)
}
评论
相关问题:stackoverflow.com/questions/2287616/…如果使用选项(数字= 4),那不将计算限制为4位数,是吗?在这种情况下,它将使程序的准确性大大降低。仅影响打印时的编号,对吗?
控制打印数值时要打印的位数。这只是一个建议。有效值为1 ... 22,默认值为7。有关大于15的值,请参见print.default中的注释。?选项仅影响输出。
请注意,round(23,digits = 2)将打印23,而不是23.00。如果需要后者,请尝试stackoverflow.com/a/12135122/180892
@PaulHurleyuk,我认为在编程中最好使用尽可能少的库。对于每个琐碎的需求使用不同库的人通常会陷入混乱,文件过大,可移植性问题等问题。