函数write()与数字表示法不一致
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数write()与数字表示法不一致相关的知识,希望对你有一定的参考价值。
请考虑以下脚本:
list_of_numbers <- as.numeric()
for(i in 1001999498:1002000501){
list_of_numbers <- c(list_of_numbers, i)
}
write(list_of_numbers, file = "./list_of_numbers", ncolumns = 1)
生成的文件如下所示:
[user@pc ~]$ cat list_of_numbers
1001999498
1001999499
1.002e+09
...
1.002e+09
1.002e+09
1.002e+09
1002000501
我找到了几个范围,其中R不能始终如一地打印数字格式。
现在我有以下问题:
这是一个错误还是存在这种行为的实际原因?为什么只是在某些范围内,为什么不是每个数字都高于x?
我知道如何解决这个问题:
options(scipen = 1000)
但是,设置全局选项还有更优雅的方式吗?不将其转换为数据帧并更改格式。
答案
这不是一个错误,R选择最短的表示。
更准确地说,在?options
,人们可以读到:
固定符号将是首选,除非它比
scipen
数字更宽。
所以当scipen
为0(默认值)时,最短的符号是首选。
请注意,您可以使用x
获得数字format(x, scientific = TRUE)
的科学记数法。
在你的情况下:
1001999499
长10个字符,而其科学记数法1.001999e+09
更长(12个字符),因此保留十进制表示法。1001999500
:科学记数法是1.002e+09
,它更短。- .....................(科学记数保持等于
1.002e+09
,因此更短) 1002000501
:1.002001e+09
更长。
你可能会问:为什么1001999500
被格式化为1.002e+09
而不是1.0019995e+09
?这只是因为还有一个控制有效位数的选项。它被命名为digits
,其默认值为7.由于1.0019995
有8位有效数字,所以它向上舍入为1.002
。
确保在不更改全局选项的情况下保持十进制表示法的最简单方法可能是使用format
:
write(format(list_of_numbers, scientific = FALSE, trim = TRUE),
file = "./list_of_numbers")
旁注:你不需要一个循环来生成你的list_of_numbers
(顺便说一句,它不是一个列表而是一个向量)。只需使用:
list_of_numbers <- as.numeric(1001999498:1002000501)
以上是关于函数write()与数字表示法不一致的主要内容,如果未能解决你的问题,请参考以下文章