2010-07-14 50 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="#"))) 
}