科学计数转换
R 默认对超过一定位数的数值采用科学计数法表示,但有时候直查看数据还是直接展示更加直观。
> format(1.11011E+16, scientific = FALSE, digits = 0)
[1] "11101100000000000"
也可以通过设置options参数更改系统默认行为
> 12345600000000000000
[1] 1.23456e+19
> options(scipen = 20)
> 12345600000000000000
[1] 12345600000000000000
大数值数据
> options(scipen = 100) #为了看出差别先把科学计数显示的位数设高些
对于大数值(超过23位的数据)会产生精度问题,无论是直接输入还是用科学计数法都会由于精度问出现误差:
> 100000000000000000000000
[1] 99999999999999991618642
> format(1E+28, scientific = FALSE)
[1] " 9999999999999999583262242462"
以及计算错误:
> a <- 1000000000000000000000000
> b <- a + 1
> a == b
[1] TRUE
此时可通过使用gmp
和Rmpfr
包来解决, 其中gmp
是Rmpfr
的依赖包所以只用安装后者即可。需要注意的是
输入数据必须是字符型的,数值型数据在作为参数传入时会被函数的执行环境改变,从而无法完成转换。
> gmp::as.bigz('100000000000000000000000000000000') # 传入数据得是字符型
Big Integer ('bigz') :
[1] 100000000000000000000000000000000
对比:
> as.numeric('100000000000000000000000000000000')
[1] 100000000000000005378260420040822
当然,此类差别在低精度情况下是不存在的。此外,一些常量也可以通过Rmpfr
来获取,比如pi:
> library(Rmpfr)
> Const("pi", prec = 160)
1 'mpfr' number of precision 160 bits
[1] 3.141592653589793238462643383279502884197169399376e0
> Const("pi", prec = 1024)
1 'mpfr' number of precision 1024 bits
[1] 3.14159265358979323846264338327950288419716939937510582
097494459230781640628620899862803482534211706798214808651
3282306647093844609550582231725359408128481117450284102701
938521105559644622948954930381964428810975665933446128475
648233786783165271201909145648566923460348610454326648213
393607260249141273724587e0
通过设置比特精度,可以实现任意大值数据的转换,甚至是字符型的科学计数法数据也没问题,有些时候从excel读取的数据会被直接转换成类似’1.23E+30’的字符格式,想要还原数据的本来面目可以采用以下的函数:
> mpfr('100000000000000000000000000', prec = 10) # 低精度时依然存在误差
1 'mpfr' number of precision 10 bits
[1] 100038611573110564206936064
> mpfr('100000000000000000000000000', prec = 100) # 将精度调高即可解决问题
1 'mpfr' number of precision 100 bits
[1] 100000000000000000000000000
> mpfr('1e+30', prec = 100) # 对于科学计数法表示的数据也可以正常转换
1 'mpfr' number of precision 100 bits
[1] 1000000000000000000000000000000