四舍五入到有效数字*仅*,R中数字的小数部分



signif()函数根据 给定值中的有效数字。该函数适用于所有 但是,数字中的数字,因此不同顺序的数字 量级的舍入和截断方式不同。例如,有了这个 矢量x...

x <- c(100.1303421, 10.03421, 1.3421, 0.0003421)
lapply(x, signif, 2)
#> [[1]]
#> [1] 100
#> 
#> [[2]]
#> [1] 10
#> 
#> [[3]]
#> [1] 1.3
#> 
#> [[4]]
#> [1] 0.00034

。第一个和第二个值被截断为 100 和 10,并且 十进制值消失,而第三个和第四个值保持不变 小数(虽然数字不同)。这是来自signif()- 它正确地考虑了以下所有数字: 确定重大。

是否可以忽略每个数字的整数部分而仅保留格式 具有固定有效位数的小数部分?我想成为 能够返回这些值:c(100.13, 10.034, 1.34, 0.00034);那 是,.前面的完整整数,后跟有效整数 数字小数部分的数字。

现在,我创建了一个将值分成整数和 分数分量,并且仅在馏分量上运行signif(), 但这似乎格外笨拙。

signif_ignore_integer <- function(x, digits = 2) {
as.integer(x) + signif(x - as.integer(x), digits)
}
lapply(x, signif_ignore_integer, 2)
#> [[1]]
#> [1] 100.13
#> 
#> [[2]]
#> [1] 10.034
#> 
#> [[3]]
#> [1] 1.34
#> 
#> [[4]]
#> [1] 0.00034

有没有更好,更推荐的方法(可能有一些花哨sprintf()格式)将值舍入到给定数量的有效值 数字,而忽略它们的整数部分?

可能有更好的方法,但你的一般方法似乎并非不合理。但是,你可以通过使用floor来简化它,利用矢量化来避免lapply,并使用 mod 运算符返回每个数字的小数部分:

my_signif = function(x, digits) floor(x) + signif(x %% 1, digits)
my_signif(x, 2)
[1] 100.13000  10.03400   1.34000   0.00034

相关内容

  • 没有找到相关文章

最新更新