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