舍入到有效数字*仅*带有R中数字的小数部分

时间:2017-03-27 15:47:35

标签: r rounding significant-digits

signif()函数根据指定的数量舍入值 给定值中的有效数字。该功能适用​​于所有 但是,数字中的数字,所以不同订单的数量 幅度是四舍五入和截断不同。例如,有了这个 vector 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()格式)将值舍入到给定数量的重要值 数字而忽略它们的整数分量?

1 个答案:

答案 0 :(得分:1)

可能有更好的方法,但您的一般方法似乎并不合理。但是,您可以使用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