格式化R中的小数位数

时间:2010-08-09 19:57:41

标签: r formatting rounding

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

x <- 1.128347132904321674821

编辑:

使用:

options(digits=2)

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

-

答案:round(x,digits = 2)

14 个答案:

答案 0 :(得分:327)

背景:此页面上建议的某些答案(例如signifoptions(digits=...))并不保证为任意数字显示一定数量的小数。我认为这是R中的一个设计特征,其中良好的科学实践涉及根据“significant figures”的原则显示一定数量的数字。但是,在许多域(例如,APA style,业务报告)格式要求中,要求显示一定数量的小数位。这通常是为了一致性和标准化目的而不是关注重要数据。

<强>解决方案

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

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

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

这里format="f"给出通常小数位的浮点数,例如xxx.xxx,digits指定位数。相比之下,如果您想要显示一个整数,则可以使用format="d"(非常类似于sprintf)。

答案 2 :(得分:19)

您可以尝试我的包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

答案 3 :(得分:14)

假设您要保留尾随零

表示2位小数

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

给出了

[1] "5.50"

正如@mpag在下面提到的那样,似乎R有时可以用这个和圆形方法给出意想不到的值,例如: sprintf(5.5550,fmt ='%#。2f')给出5.55,而不是5.56

答案 4 :(得分:6)

检查功能 prettyNum,格式

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

答案 5 :(得分:5)

类似的东西:

options(digits=2)

数字选项的定义:

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

答案 6 :(得分:4)

如果您更喜欢有效数字到固定数字,那么signif命令可能很有用:

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

答案 7 :(得分:3)

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

答案 8 :(得分:2)

请注意,R中的数字对象与double precision一起存储,它为您提供(大致)16位精度的十进制数字 - 其余为噪声。我承认上面显示的数字可能只是一个例子,但它长22位。

答案 9 :(得分:2)

我使用此变体强制打印K小数位:

# format numeric value to K decimal places
formatDecimal <- function(x, k) format(round(x, k), trim=T, nsmall=k)

答案 10 :(得分:1)

在我看来会像是

library(tutoR)
format(1.128347132904321674821, 2)

每一点online help

答案 11 :(得分:1)

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

round(data, 2)

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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

我写了这个可以改进的函数,但看起来在极端情况下效果很好。例如,在 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)
    )
  }
}

示例:

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"