signif 没有给我 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,因为我有一些类似的情况(参见下面的示例(,并且我不想要0s。

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:

对于数字x,signif(x, dig)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

创建于2022-04-04由reprex包(v2.0.1(

最新更新