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 创建
我想用有效数字四舍五入我的数据。因此,我正在使用 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 asround(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 创建