在R中很好地将数字格式化为有效数字

时间:2010-07-14 12:05:57

标签: r

我想将报告中的数字格式化为significant digits,但要保留尾随的重要零并正确格式化大数

例如,数字c(10.00001,12345,1234.5,123.45,1.2345,0.12345)到3位有效数字应该是10.0,12300,1230,123,1.23,0.123但是我用不同的方法得到了不同的结果(似乎没有普遍地工作。

> numbers<-c(10.00001,12345,1234.5,123.45,1.2345,0.12345)
> for(n in seq(numbers)){
+   print(signif(numbers[n],digits=3))
+   print(format(numbers[n],digits=3))
+   print(formatC(numbers[n], digits=3,format="fg"))
+   print(formatC(numbers[n], digits=3,format="fg", flag="#"))
+   }
[1] 10
[1] "10"
[1] "  10"
[1] "10.0"
[1] 12300
[1] "12345"
[1] "12345"
[1] "12345."
[1] 1230
[1] "1234"
[1] "1234"
[1] "1234."
[1] 123
[1] "123"
[1] " 123"
[1] "123."
[1] 12.3
[1] "12.3"
[1] "12.3"
[1] "12.3"
[1] 1.23
[1] "1.23"
[1] "1.23"
[1] "1.23"
[1] 0.123
[1] "0.123"
[1] "0.123"
[1] "0.123"

这里,signif和format围绕10.00001结果。 formatC with flag =“#”正确地表示小数字而不是大数字。

有更好的方法吗?

6 个答案:

答案 0 :(得分:27)

抱歉,我当时没有更新过这个。我的问题中的所有陈述都没有,或者是非常有效。最后我用了

print(formatC(signif(numbers[n],digits=3), digits=3,format="fg", flag="#"))

正确应对尾随零和大数字。

答案 1 :(得分:13)

您是否了解prettyNum()及其所有选项?

答案 2 :(得分:4)

更准确的选项是options(),它只是舍入。如果你计划这么做,我建议你看一下Sweave。

> a <- 1.23456789
> options(digits=2)
> a
[1] 1.2
> options(digits=6)
> a
[1] 1.23457

答案 3 :(得分:4)

Paul的回答的另一个修改。它似乎也留下了一个尾随的小数。我正在用gsub删除它:

sigfig <- function(vec, digits){
  return(gsub("\\.$", "", formatC(signif(vec,digits=digits), digits=digits, format="fg", flag="#")))
}

答案 4 :(得分:3)

如果你喜欢科学记谱法

> format(2^31-1, scientific = TRUE, digits = 3)
[1] "2.15e+09"

答案 5 :(得分:3)

保罗赫尔利的上述方法对于我的正面和负面数据都很有效。下面是一些代码,它将Paul的解决方案修改为一个函数,在该函数中可以指定所需的有效数字。

sigfig <- function(vec, n=3){ 
### function to round values to N significant digits
# input:   vec       vector of numeric
#          n         integer is the required sigfig  
# output:  outvec    vector of numeric rounded to N sigfig

formatC(signif(vec,digits=n), digits=n,format="fg", flag="#") 

}      # end of function   sigfig

验证它是否正常

numbers <- c(50000.01, 1000.001, 10.00001, 12345, 1234.5, 123.45, 1.2345, 0.12345, 0.0000123456, -50000.01, -1000.001,-10.00001, -12345, -1234.5, -123.45, -1.2345, -0.12345, -0.0000123456)
sigfig(numbers)   # defaults to 3
sigfig(numbers, 3)
sigfig(numbers, 1)
sigfig(numbers, 6)