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