科学计算常对数字格式有所要求,最常见的就是保留数字的有效位数。在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"