天天看點

R語言:數字格式一、有效數字二、千分符

一、有效數字

  科學計算常對數字格式有所要求,最常見的就是保留數字的有效位數。在R語言中處理數字格式的函數主要有round、signif、sprintf和format。

  最常用的round(x, digits = 0)函數是四舍五入保留有效位數,其參數x是要進行處理的資料,digits是從小數點算起要保留的有效位數。注意,digits可以取負數,假如取-2,即意味着保留百位數。另外,盡管round是四舍五入取值,但也有特例,如round(0.5) = 0。

  signif(x, digits = 6)函數與round類似,也是四舍五入取數,隻是digits是從第一個數字開始算有效位數。

> round(15.3589, 3)
[1] 15.359
> signif(15.3589, 3)
[1] 15.4
           

  但是round和signif有一個問題,假如對2.9999保留兩位小數,得到的結果是3而不是3.00,它們會自動把小數點後面最後的0省略。這個問題可以用format函數解決。

format(x, trim = FALSE, digits = NULL, nsmall = 0L,

       justify = c("left", "right", "centre", "none"),

       width = NULL, na.encode = TRUE, scientific = NA,

       big.mark   = "",   big.interval = 3L,

       small.mark = "", small.interval = 5L,

       decimal.mark = getOption("OutDec"),

       zero.print = NULL, drop0trailing = FALSE, ...)

  format函數的作用是使x中各元素統一成一樣的格式,具體來說是将它們統一為相同的寬度,不足的用空格補齊,這時數字會自動轉化為字元。例如:

> format(c('a', 'bb', 'ccc'))
[1] "a  " "bb " "ccc"
> format(1:10)
 [1] " 1" " 2" " 3" " 4" " 5" " 6" " 7" " 8" " 9" "10"
           

  注意上圖中數字1-9前面的空格。

  當trim為TRUE時,數字型元素中的空格會被省略;digits是數字保留的有效位數,nsmall是小數點後最少保留的位數。對2.9999保留兩位小數,可以使用format(2.999, digits = 3, nsmall = 2),digits和nsmall參數需聯合使用,隻使用nsmall = 2還會傳回2.999,這是因為nsmall = 2表示小數點後至少保留2位小數,原始資料有3位小數時将保留3位。

> format(2.999, digits = 3, nsmall = 2)
[1] "3.00"
> format(2.999, digits = 3)
[1] "3"
> format(2.999, nsmall = 2)
[1] "2.999"
           

  如需使用科學計數法,需将參數scientific設為TRUE。

> format(1234567, scientific = T)
[1] "1.234567e+06"
           

  除了保留小數位數,還有一種常用的數字格式是将整數統一為相同的位數,不足的在前面加0,如将1補為001,這時需使用sprintf(fmt, ...)函數。sprintf函數取自C語言,參數fmt即最終輸出的格式。sprintf(fmt, x)意味着将x按fmt中給出的格式插入到fmt中%符号所在的位置。

> sprintf("%s is %f feet tall\n", "Sven", 7.1)
[1] "Sven is 7.100000 feet tall\n"
           

  上式意味着将Sven插入到%s is %f feet tall\n這句話的%s處,将7.1插入到%f處,其中字尾s和f代表了資料格式是字元型和雙精度數字。如果是整數型數字,可用d, i, o, x, X做字尾,其中o代表轉化為八進制整數格式,x和X代表轉化為十六進制整數格式。

> sprintf("%o", 7:11)
[1] "7"  "10" "11" "12" "13"
> sprintf("%x", 9:17)
[1] "9"  "a"  "b"  "c"  "d"  "e"  "f"  "10" "11"
> sprintf("%X", 9:17)
[1] "9"  "A"  "B"  "C"  "D"  "E"  "F"  "10" "11"
           

  将1補為001可以使用sprintf(‘%03d’, 1)實作。

> sprintf('%03d', 1)
[1] "001"
           

二、千分符

  展示較大的數字時通常需要添加千分符,例如100,000,000,如果沒有這兩個逗号,100000000就得一個零一個零的去數,不友善大家對數字産生直覺的認識。在R語言可以使用prettyNum自動添加千分符,處理後的資料自動轉化為字元型(character)。

  prettyNum(x, big.mark = "",   big.interval = 3L,

            small.mark  = "", small.interval = 5L,

            decimal.mark = getOption("OutDec"), input.d.mark = decimal.mark,

            preserve.width = c("common", "individual", "none"),

            zero.print = NULL, replace.zero = FALSE,

            drop0trailing = FALSE, is.cmplx = NA,

            ...)

  其中,x是要處理的資料,可以是數值型也可以是字元型,big.mark是在小數點左邊添加的分隔符,big.interval規定每隔幾位添加分隔符,預設為3(就是千分符),如果改為4就是萬分符, small.mark是在小數點右邊添加分隔符,small.interval是它的分隔位數。

> # 以逗号為分隔
> prettyNum(372638624, big.mark = ',')
[1] "372,638,624"
> # 以空格為分隔
> prettyNum(372638624, big.mark = ' ')
[1] "372 638 624"
> # 萬分符
> prettyNum(372638624, big.mark = ',', big.interval = 4)
[1] "3,7263,8624"
           

繼續閱讀