格式R的小数位置

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

x <- 1.128347132904321674821

编辑:

用途:

options(digits=2)

被认为是一个可能的答案。是否有一种方法可以在脚本中指定这一点,以便一次性使用?当我将它添加到我的脚本时,它似乎没有做任何不同的事情,我对大量重新输入来格式化每个数字不感兴趣(我正在自动化一个非常大的报告)。

--

答案:整数(x,数字=2)

797764 次浏览

在我看来就像是

library(tutoR)
format(1.128347132904321674821, 2)

每一个小在线帮助

就像这样:

options(digits=2)

数字选项的定义:

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

检查函数prettyNum、格式

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

如果你更喜欢有效数字而不是固定数字,signif命令可能会有用:

> 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位数长。

背景:本页上建议的一些答案(例如,signifoptions(digits=...))不保证对任意数字显示一定数量的小数。我认为这是R中的一个设计特性,即良好的科学实践包括根据“__abc3”原则显示一定数量的数字。然而,在许多域(例如,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答案工作得相当好。但在某些情况下,它们会显示负0,这可能是不需要的。也就是说,

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"

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

我使用这个变体来强制打印K位小数点后数位:

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

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

你可以格式化一个数字,比如x,直到你想要的小数点。这里x是一个小数点后很多位的数字。假设我们希望显示这个数字的小数点后8位:

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

这里format="f"给出了通常小数点后的浮点数,比如xxx。xxx, digits为位数。相比之下,如果你想要显示一个整数,你可以使用format="d"(很像sprintf)。

小数点后两位假设你想保持后面的0

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)
}

我写了这个可以改进的函数,但看起来在极端情况下工作得很好。例如,在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"
library(dplyr)
# round the numbers
df <- df %>%
mutate(across(where(is.numeric), .fns = function(x) {format(round(x, 2), nsmall = 2)}))

在这里,我将所有数值更改为只有2位小数。如果你需要把它改到小数点后几位

# round the numbers for k decimal places
df <- df %>%
mutate(across(where(is.numeric), .fns = function(x) {format(round(x, k), nsmall = k)}))

将k替换为所需的小数点后数位