signif 没有给我 R 中有效数字的正确数量

signif doesn't give me the correct number of significant digits in R

我想用有效数字四舍五入我的数据。因此,我正在使用 signif 来实现这一点。

例如:

signif(0.0054324, digits=2)
[1] 0.0054

但是,我意识到在某些情况下 signif 并没有像我预期的那样工作。

signif(1003.04, digits=3)
[1] 1000

signif(1005.04, digits=3)
[1] 1010

如您所见,在前面的示例中,它似乎使用了 ceiling 或者只是给我整数,没有任何数字。

请注意,我不想使用 round,因为我有一些这样的情况(请参见下面的示例)并且我不想要 0。

round(0.000000054324, digits=2)
[1] 0

对于这种情况,signif 正好满足了我的需求。

signif(0.000000054324, digits=2)
[1] 5.4e-08

有人知道我在使用“大”数字时如何解决这个问题吗? (因为它与小的完美配合)。或者如果你知道任何其他方法。

非常感谢

这个小函数应该可以为您提供所需的结果。它的工作原理是仅将 signif 应用于数字的小数部分,同时保留整数部分。

mysignif <- function(x, digits = 3) {
  x %/% 1 + signif(x %% 1, digits)
} 

mysignif(0.0054324, digits=2)
#> [1] 0.0054

mysignif(1003.04, digits=3)
#> [1] 1003.04

mysignif(1005.04, digits=3)
#> [1] 1005.04

mysignif(0.000000054324, digits=2)
#> [1] 5.4e-08

mysignif(1.0005433, digits = 3)
#> [1] 1.000543

来自?signif

For numeric x, signif(x, dig) is the same as round(x, dig - ceiling(log10(abs(x))))

dig > ceiling(log10(abs(x)))) 这导致 round() 中的负数,因此您可以对大数进行四舍五入。

我会这样修复它,将 dig - ceiling(log10(abs(x)))) 限制为 0:

my_signif <- function(x, digits = 4) {
  
  round(x, pmax(digits - ceiling(log10(abs(x))), 0))
  
}  



my_signif(0.0054324, digits=2)
#> [1] 0.0054
my_signif(0.000000054324, digits=2)
#> [1] 5.4e-08
my_signif(1003.04, digits=3)
#> [1] 1003
my_signif(1005.04, digits=3)
#> [1] 1005

reprex package (v2.0.1)

于 2022-04-04 创建