经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » R语言 » 查看文章
R语言科学计数法介绍:digits和scipen设置方式
来源:jb51  时间:2021/4/19 10:26:43  对本文有异议

控制R语言科学计算法显示有两个option: digitis和scipen。介绍的资料很少,而且有些是错误的。经过翻看R语言的帮助和做例子仔细琢磨,总结如下:

默认的设置是:

  1. getOption("digits")
  2. [1] 7
  3. getOption("scipen")
  4. [1] 0

digits 有效数字字符的个数,默认是7, 范围是[1,22]

scipen 科学计数显示的penalty,可以为正为负,默认是0

R输出数字时,使用普通数字表示的长度 <= 科学计数法表示的字符长度 + scipen长度时,保留普通数字表示的长度,否者采用科学计数法表示。

举个栗子:

  1. > options(digits = 2) # 有效数字为2位
  2. > options(scipen = 1)
  3. > 1 # 1e+00 长度为5, 保留1显示,长度为1
  4. [1] 1
  5. > 12345678 # 1.2e+07, 长度为7, 7 + scipen = 8, 普通数字表示长度为8, 没有超过8, 任然保留不同数字的表示。
  6. [1] 12345678
  7. > 123456789 # 1.2e+08, 长度为7, 7 + scipen =8, 普通数字表示长度为9,因此切换成科学计数法表示
  8. [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

  1. > options(scipen = -2)
  2. > 1234
  3. [1] 1234
  4. > 12345
  5. [1] 12345
  6. > 123456
  7. [1] 1.2e+05

果然!

补充:R语言设置数值输出(保留至小数点后位数和保留有效数字)

在R语言中,数字的输出默认为7位:

  1. > a = 0.1234567890 #10位
  2. > a
  3. [1] 0.1234568

注:输出结果四舍五入。

1 options(digits)函数

通过options(digits)函数设置输出长度,当digits = 3时:

  1. > options(digits = 3)
  2. > a = 0.1234567890 #10位
  3. > a
  4. [1] 0.123

当digits = 10时:

  1. > options(digits = 10)
  2. > a = 0.1234567890 #10位
  3. > a
  4. [1] 0.123456789

digits最大取22,超过22会报错:

  1. > options(digits = 3)
  2. > options(digits = 22)
  3. > options(digits = 23)
  4. Error in options(digits = 23) :
  5. invalid 'digits' parameter, allowed 0...22

输出的结果只保留了9位,末尾的0被省略。

2 round(x, n)函数

round(x, n)函数中,x为数字,n为小数点后保留的位数,设置n = 4时:

  1. > a = 0.1234567890 #10位
  2. > round(a, 4)
  3. [1] 0.1235
  4. > a = 1.234567890 #小数点后9位
  5. > round(a, 4)
  6. [1] 1.2346

注:输出结果四舍五入。

当设置n = 10时:

  1. > a = 0.1234567890 #10位
  2. > round(a, 10)
  3. [1] 0.123456789

输出的结果只保留了9位,末尾的0被省略。

当小数点后的0的位数超过n时,输出的结果为0:

  1. > a = 0.0001234567890 #13位
  2. > round(a, 3)
  3. [1] 0
  4. > a = 0.0001234567890 #13位
  5. > round(a, 4)
  6. [1] 1e-04

3 signif(y, n)函数

signif(x, n)函数中,x为数字,n为有效数字的个数 ,当n = 4时:

  1. > a = 1.234567890 #小数点后9位
  2. > signif(a, 4)
  3. [1] 1.235
  4. > a = 0.000001234567890 #小数点后15位
  5. > signif(a, 4)
  6. [1] 1.235e-06

当n = 10时:

  1. > a = 1.234567890 #小数点后9位
  2. > signif(a, 10)
  3. [1] 1.23456789

此时数字末尾的0依旧被省略。

4 sprintf(fmt, …)函数

  1. > a = 0.1234567890 #小数点后10位
  2. > sprintf("%0.4f", a)
  3. [1] "0.1235"
  4. > a = 0.1234567890 #小数点后10位
  5. > sprintf("%0.10f", a)
  6. [1] "0.1234567890"

通过sprintf(fmt, ...)函数可以保留末尾的0。

当输入为整数时,位数不够会在输入值前面补0:

  1. > a = 12456789
  2. > sprintf("%03d", a)
  3. [1] "12456789"
  4. > a = 12
  5. > sprintf("%03d", a)
  6. [1] "012"

欢迎大家批评指正。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。如有错误或未考虑完全的地方,望不吝赐教。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号