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"

 

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值