在R中设置小数点格式

在R中设置小数点格式,r,formatting,rounding,r-faq,R,Formatting,Rounding,R Faq,我有一个数字,例如1.128347132904321674821,当输出到屏幕(或写入文件)时,我只想显示为两位小数。你是怎么做到的 x <- 1.128347132904321674821 这是一个可能的答案。有没有一种方法可以在脚本中指定一次性使用?当我把它添加到我的脚本中时,它似乎没有做任何不同的事情,而且我对大量重新键入以格式化每个数字不感兴趣(我正在自动生成一个非常大的报告) -- 回答:圆形(x,数字=2)在我看来是这样的 library(tutoR) format(1.12

我有一个数字,例如1.128347132904321674821,当输出到屏幕(或写入文件)时,我只想显示为两位小数。你是怎么做到的

x <- 1.128347132904321674821
这是一个可能的答案。有没有一种方法可以在脚本中指定一次性使用?当我把它添加到我的脚本中时,它似乎没有做任何不同的事情,而且我对大量重新键入以格式化每个数字不感兴趣(我正在自动生成一个非常大的报告)

--


回答:圆形(x,数字=2)

在我看来是这样的

library(tutoR)
format(1.128347132904321674821, 2)
有一点

诸如此类:

options(digits=2)
数字定义选项:

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

检查函数prettyNum,格式


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

如果您更喜欢有效数字而不是固定数字,则该命令可能有用:

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

请注意,R中的数字对象存储为,这将(大约)为您提供16位精度的十进制数字-其余将是噪波。我同意上面显示的数字可能只是一个例子,但它是22位长。

背景:本页建议的一些答案(例如,
符号,
选项(数字=…)
)并不保证为任意数字显示一定数量的小数。我认为这是R中的一个设计特征,其中良好的科学实践包括根据“”的原则显示一定数量的数字。但是,在许多域(例如,业务报告)中,格式要求显示一定数量的小数位数。这通常是出于一致性和标准化的目的,而不是关注重要的数字

解决方案

以下代码正好显示了数字
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))

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

我将此变量用于强制打印K位小数:

# format numeric value to K decimal places
formatDecimal <- function(x, k) format(round(x, k), trim=T, nsmall=k)
#将数值格式化为小数点后K位
你可以试试我的软件包

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


您可以设置数字格式,如
x
,最多可设置小数位数。这里的
x
是一个有许多小数位的数字。假设我们希望最多显示该数字的8位小数:

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

这里,
format=“f”
以通常的小数位给出浮点数,例如xxx.xxx,
数字
指定位数。相比之下,如果您想要显示一个整数,您可以使用
format=“d”
(很像
sprintf
)。

保留小数点后两位,假设您想保留后面的零

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

[1] "5.50"

正如@mpag在下面提到的,似乎R有时会用这个方法给出意外的值,而舍入方法,例如sprintf(5.5550,fmt='%#.2f')给出5.55,而不是5.56。如果您只想对数字或列表进行舍入,只需使用

round(data, 2)

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

这是我从单位到百万的方法。 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)
}

number我编写了这个函数,它可以改进,但看起来在极端情况下效果很好。例如,在0.9995的情况下,投票正确答案为1.00,这是不正确的。我在数字没有小数的情况下使用这个解决方案

round_correct <- function(x, digits, chars = TRUE) {
  if(grepl(x = x, pattern = "\\.")) {
    y <- as.character(x)
    pos <- grep(unlist(strsplit(x = y, split = "")), pattern = "\\.", value = FALSE)
    if(chars) {
      return(substr(x = x, start = 1, stop = pos + digits))
    }
    return(
      as.numeric(substr(x = x, start = 1, stop = pos + digits))
    )
  } else {
    return(
      format(round(x, 2), nsmall = 2)
    )
  }
}

相关问题:如果使用选项(数字=4),那么计算不会限制为4位,是吗?在这种情况下,它将使程序的准确性大大降低。它只影响打印时的数字,对吗?
控制打印数值时要打印的位数。这只是一个建议。有效值为1…22,默认值为7。请参阅print.default中关于大于15的值的说明。
from?options它只影响输出。请注意
round(23,digits=2)
将打印
23
,而不是
23.00
。如果您想要后者,请尝试@PaulHurleyuk,我认为在编程中使用尽可能少的库是一种很好的做法。如果有人在每个琐碎的需求中使用不同的库,通常会导致混乱、大文件、可移植性问题等。我找到了这个库,但它需要一个包,我在基本包中寻找一些东西。@brandon,format()是基本包的一部分。打开R并键入?格式。。。不需要软件包。Hrmmm,你看了它的输出吗?[1] “1.128347”否则,你认为它在基本包中是完全正确的,我的错。也许可以尝试
format.default(x,digits=2)
只是根据提供的链接在黑暗中拍摄。这些信息是我通常阅读文档时所缺少的,我希望也能看到打印的输出。只是注意到您的链接指向教程文档,它不是基础的一部分。在运行脚本时有没有办法动态设置这些信息?这适用于R控制台中的输出,但是在我的脚本中不起作用(它们仍然是.1289273982)。我有一个奇怪的行为,
digits
选项似乎没有设置小数点后的位数。例如,当我设置选项(数字=2)时,打印7.25会导致输出7.2,1234.25变为1234,0.25保持为0.25。如果你只需要一次性使用,你绝对不应该这样做。更改选项将影响一切。谢谢Paul。这个
sprintf(5.5, fmt = '%#.2f')
[1] "5.50"
round(data, 2)
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)
}
round_correct <- function(x, digits, chars = TRUE) {
  if(grepl(x = x, pattern = "\\.")) {
    y <- as.character(x)
    pos <- grep(unlist(strsplit(x = y, split = "")), pattern = "\\.", value = FALSE)
    if(chars) {
      return(substr(x = x, start = 1, stop = pos + digits))
    }
    return(
      as.numeric(substr(x = x, start = 1, stop = pos + digits))
    )
  } else {
    return(
      format(round(x, 2), nsmall = 2)
    )
  }
}
round_correct(10.59648, digits = 2)
[1] "10.59"
round_correct(0.9995, digits = 2)
[1] "0.99"
round_correct(10, digits = 2)
[1] "10.00"