8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

在 R 中格式化小数位

DOKARR 2月前

212 0

我有一个数字,例如 1.128347132904321674821,我想在输出到屏幕(或写入文件)时仅显示两位小数。该怎么做?x <- 1。

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

x <- 1.128347132904321674821

编辑:

使用:

options(digits=2)

已建议将其作为可能的答案。有没有办法在脚本中指定一次性使用?当我将其添加到脚本中时,它似乎没有做任何不同的事情,而且我也不想重新输入大量内容来格式化每个数字(我正在自动生成一份非常大的报告)。

--

答案:round(x, digits=2)

帖子版权声明 1、本帖标题:在 R 中格式化小数位
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由DOKARR在本站《object》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 如果使用 options(digits=4),则不会将计算限制为 4 位数字,对吗?在这种情况下,程序的准确性会大大降低。它只会影响打印时的数字,对吗?

  • @PaulHurleyuk,我认为编程时使用尽可能少的库是一种很好的做法。如果一个人为了满足每个琐碎的需求而使用不同的库,那么他通常最终会陷入混乱、文件过大、可移植性问题等。

  • 背景: 本页上建议的一些答案(例如 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"
    

    替代方案讨论:

    formatC 答案 sprintf 答案 效果相当好。但它们在某些情况下会显示负零,这可能是不想要的。即,

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

    一个可能的解决方法如下:

    formatC(as.numeric(as.character(round(-.001, 2))), digits = 2, format = "f")
    # [1] "0.00" 
    
  • 我一直对 format() 和 prettyNum() 等函数如何将数字转换为字符感到困惑。您如何解决这个问题?

  • @JeromyAnglim 我注意到上述解决方案可能存在固定小数点前字符数的特殊情况缺点,例如 format(c(10, 1), nsmall=1) 得出 \'10.0\' \' 1.0\' (请注意 1.0 前面的前导空格。然而, sprintf() 函数似乎可以保证小数点两边的格式更好,例如 sprintf(c(10,1), fmt = '%#.1f') 摆脱了那个讨厌的前导空格并返回 \'10.0\' \'1.0\'。

  • @FengJiang 这不是函数的问题。相反,你也许应该避免将数字选项设置得太高。请参阅 print.default 帮助中的警告。它警告设置数字 >=16 可能会导致打印问题。

  • 根据需要 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 几乎是我为此目的所用的唯一格式。我认为这个答案很好,并且按照原帖者的要求以 R 为基础。

  • 你可以尝试我的包 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 只会对某些列的显示进行四舍五入。我需要这个修复,因为我还必须对这些列进行计算。这有效。谢谢!

  • 相比于任何 baseR 函数,我更喜欢 formattable。最大的优点是它将变量保留为数字。

  • 假设您想保留尾随零,则保留 2 位小数

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

    由此得出

    [1] "5.50"
    

    正如@mpag 在下面提到的那样,R 似乎有时会用这个和 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 中舍入的一个普遍“问题”,因为 round, nsmall 方法给出了相同的结果。

  • 谢谢@mpag,我不知道 R 在边界上舍入时遇到了困难,我刚刚尝试了 5.565,它确实向上舍入,而 5.545 向下舍入。我猜这是他们处理浮点不精确的方式。我不认为我在其他语言中见过这种行为,我猜这意味着他们有一个内置的解决方法

  • 我认为他们故意将这些值视为精度有限的值。他们认为 5.555 的值实际上可能由 5.5546 和 5.5554 的“真实”值得出。但是,如果您继续这种舍入游戏,5.444445 可能(未经测试)最终为“6”,如果您一次舍入一位数字。但您可能是对的,这可能是二进制表示略低于或略高于 5.55 的问题。

  • 引用 17

    是的,我认为如果是故意的,那么 5.565 和 5.545 之间也会保持一致。“随机性”让我想到了浮点表示。

  • 引用 18

    类似这样的:

    options(digits=2)
    

    数字选项的定义:

    digits: controls the number of digits to print when printing numeric values.
    
  • 引用 19

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

  • 引用 20

    我遇到了一个奇怪的行为,数字选项似乎没有设置小数点后的位数。例如,当我设置选项(数字 = 2)时,打印 7.25 会导致输出 7.2,1234.25 变为 1234,而 0.25 仍为 0.25。还有其他选项可以与此交互吗?

返回
作者最近主题: