2010-07-14 22 views
14

我想在我的报告格式化数字到significant digits,但保留尾随显著零和格式正确大量格式号码显著数字很好R中

例如数字C(10.00001,12345,1234.5,123.45, 1.2345,0.12345)3显著的数字应该是10.0,12300,1230,123,1.23,0.123但我得到不同的方法(和没有不同的结果似乎universaly工作。

> 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和格式轮10.00001的结果formatC with flag =“#”正确地做出小数字,但不是大数字

有没有更好的方法?

+0

也尝试申请,lapply和sapply,而不是循环的... – 2010-07-14 12:53:38

+0

我可能有一个总概念上的错误,但不会对'的功能apply'家庭仍然使用循环?但是它将代码的循环抽象出来,更简洁,更易于阅读,而且管理更少。对? – 2010-07-14 13:29:43

+0

对不起,循环只是为了显示结果,我原来有signif(数字,数字= 3),但由于某种原因默认为科学记数法。 – PaulHurleyuk 2010-07-14 14:22:46

回答

22

对不起,我从来没有更新过这个时间。我的问题没有任何陈述,或者prettynum工作。最后我用

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

它正确应付尾随零和大数字。

+5

很高兴看到使用'formatC()'是解决方案[当我将这个函数移植到R时,我特别引入了'format =“fg”'自己。通常情况下,'sprintf()'通常比formatC()更受青睐,但实际上,我没有看到通过sprintf()而不是formatC()获得解决方案的好方法。 BTW:鉴于你的'数字',我发现使用'sapply'代替for循环很方便使用'sapply'(数字,函数(N)格式C(符号(N,位数= 3),数字= 3,格式=“fg”,flag =“#”))' – 2013-11-23 17:46:53

12

您是否知道prettyNum()及其所有选项?

+0

嘿,酷,德克。一个很好的'base'选项来了解。 – isomorphismes 2012-10-02 14:23:49

+0

任何提示如何将数字格式化为字符:'1000 - > 1k','10000 - > 10k','1000000 - > 1M','1e7 - > 10M'? – jangorecki 2014-10-21 00:43:46

+3

@Jan这里有一个很漂亮的包:[prettyunits](http://cran.r-project.org/web/packages/prettyunits/) – 2014-10-21 00:46:18

4

更准系统选项是options(),它只是四舍五入。如果你打算做很多事情,我建议检查一下Sweave。

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

如果你喜欢科学记数法

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

保罗·赫尔利上述方法效果很好,我都为正数和负数。下面是一些代码,将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 

,以验证它适用于保罗的回答OK

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

另一个修改。看起来它也会留下一个尾随小数。我与GSUB将其取出:

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