当 R 是有效数字的一部分时,在不丢失尾随零的情况下进行四舍五入

问题描述 投票:0回答:1

我正在寻找将 0.1298 这样的数字显示为 0.130 的舍入行为,同时将尾随零保留为有效数字。这也适用于小数长度不同的表。我使用signif()对数据进行四舍五入,它工作得很好,除了R丢失了尾随零,但它是准确性所必需的。有这个工作功能吗?

有人对我有好主意吗?已经非常感谢了!

我尝试过修改signif


mod_signif <- function(x,digits) {
   sprintf(paste0('%#.',3,'g'), signif(x,digits))}

这对于小数点以下 5 位的数字来说效果很好,之后科学写作就开始了。

> mod_signif(0.129554,3)
[1] "0.130"
> mod_signif(0.0129554,3)
[1] "0.0130"
> mod_signif(0.00129554,3)
[1] "0.00130"
> mod_signif(0.000129554,3)
[1] "0.000130"
> mod_signif(0.0000129554,3)
[1] "1.30e-05"

在这种情况下我期望 0.0000130

如果我尝试用 format() 函数来抵消这个问题,我就会开始原地踏步,因为然后我会回到数字并再次失去零......

r rounding significant-digits
1个回答
0
投票

您可以使用

scales::label_number()
。由于秤包中贴标机的工作方式,这需要在另一个函数体内创建一个函数。

另请注意,您需要执行一些简单的算术,将

signif()
期望的参数转换为
label_number()
期望的参数。

library(scales)

label_nicely <- function(number, digits){
  
  value <- signif(number, digits)
  
  ## accuracy is expected to be (e.g.) 0.01 rather than, say, 3
  accuracy_arg <- 1 / 10^digits
  
  ## Construct a labeler within the function body
  labeller <- label_number(accuracy = accuracy_arg)
  
  label <- labeller(value)
  
    return(label)
} 

label_nicely(0.129554,3)
#> [1] "0.130"
label_nicely(0.0000129554, 3)
#> [1] "0.000"

创建于 2023-09-15,使用 reprex v2.0.2

© www.soinside.com 2019 - 2024. All rights reserved.