R語言科學計數法介紹:digits和scipen設置方式
控制R語言科學計算法顯示有兩個option: digitis和scipen。介紹的資料很少,而且有些是錯誤的。經過翻看R語言的幫助和做例子仔細琢磨,總結如下:
默認的設置是:
getOption("digits") [1] 7 getOption("scipen") [1] 0
digits
有效數字字符的個數,默認是7, 范圍是[1,22]
scipen
科學計數顯示的penalty,可以為正為負,默認是0
R輸出數字時,使用普通數字表示的長度 <= 科學計數法表示的字符長度 + scipen長度時,保留普通數字表示的長度,否者采用科學計數法表示。
舉個栗子:
> options(digits = 2) # 有效數字為2位 > options(scipen = 1) > 1 # 1e+00 長度為5, 保留1顯示,長度為1 [1] 1 > 12345678 # 1.2e+07, 長度為7, 7 + scipen = 8, 普通數字表示長度為8, 沒有超過8, 任然保留不同數字的表示。 [1] 12345678 > 123456789 # 1.2e+08, 長度為7, 7 + scipen =8, 普通數字表示長度為9,因此切換成科學計數法表示 [1] 1.2e+08
一個簡單的方法(不那麼準確,比如digits=1時,沒有小數點;數非常大時,指數可能是3位數)估算最長的數字串可以這樣:
digits + 1 (小數點)+ 4 (e+XX科學計數法表示) + scipen
比如剛才最長不用科學計數法表示的數字長度是2+1+4+1 = 8
我們看看修改scipen = -2, 驗證是不是最長數字長度是2+1+4 – 2 = 5
> options(scipen = -2) > 1234 [1] 1234 > 12345 [1] 12345 > 123456 [1] 1.2e+05
果然!
補充:R語言設置數值輸出(保留至小數點後位數和保留有效數字)
在R語言中,數字的輸出默認為7位:
> a = 0.1234567890 #10位 > a [1] 0.1234568
註:輸出結果四舍五入。
1 options(digits)函數
通過options(digits)函數設置輸出長度,當digits = 3時:
> options(digits = 3) > a = 0.1234567890 #10位 > a [1] 0.123
當digits = 10時:
> options(digits = 10) > a = 0.1234567890 #10位 > a [1] 0.123456789
digits最大取22,超過22會報錯:
> options(digits = 3) > options(digits = 22) > options(digits = 23) Error in options(digits = 23) : invalid 'digits' parameter, allowed 0...22
輸出的結果隻保留瞭9位,末尾的0被省略。
2 round(x, n)函數
round(x, n)函數中,x為數字,n為小數點後保留的位數,設置n = 4時:
> a = 0.1234567890 #10位 > round(a, 4) [1] 0.1235 > a = 1.234567890 #小數點後9位 > round(a, 4) [1] 1.2346
註:輸出結果四舍五入。
當設置n = 10時:
> a = 0.1234567890 #10位 > round(a, 10) [1] 0.123456789
輸出的結果隻保留瞭9位,末尾的0被省略。
當小數點後的0的位數超過n時,輸出的結果為0:
> a = 0.0001234567890 #13位 > round(a, 3) [1] 0 > a = 0.0001234567890 #13位 > round(a, 4) [1] 1e-04
3 signif(y, n)函數
signif(x, n)函數中,x為數字,n為有效數字的個數 ,當n = 4時:
> a = 1.234567890 #小數點後9位 > signif(a, 4) [1] 1.235 > a = 0.000001234567890 #小數點後15位 > signif(a, 4) [1] 1.235e-06
當n = 10時:
> a = 1.234567890 #小數點後9位 > signif(a, 10) [1] 1.23456789
此時數字末尾的0依舊被省略。
4 sprintf(fmt, …)函數
> a = 0.1234567890 #小數點後10位 > sprintf("%0.4f", a) [1] "0.1235" > a = 0.1234567890 #小數點後10位 > sprintf("%0.10f", a) [1] "0.1234567890"
通過sprintf(fmt, …)函數可以保留末尾的0。
當輸入為整數時,位數不夠會在輸入值前面補0:
> a = 12456789 > sprintf("%03d", a) [1] "12456789" > a = 12 > sprintf("%03d", a) [1] "012"
歡迎大傢批評指正。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- None Found