函数write()与数字表示法不一致

时间:2018-02-06 17:15:31

标签: r formatting scientific-notation

考虑以下脚本:

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)

但是,设置全局选项还有更优雅的方式吗?不将其转换为数据框并更改格式。

1 个答案:

答案 0 :(得分:0)

这不是一个错误,R选择最短的代表。

更确切地说,在?options中可以读到:

  除非scipen以上,否则

固定符号将是首选符号   数字更宽。

因此,当scipen为0(默认值)时,最短的符号是首选。

请注意,您可以使用x获取数字format(x, scientific = TRUE)的科学记数法。

在你的情况下:

  • 1001999499长度为10个字符,而其科学记数法1.001999e+09更长(12个字符),因此保留十进制表示法。
  • 1001999500:科学记数法是1.002e+09,更短。
  • .....................(科学记数保持等于1.002e+09,因此更短)
  • 10020005011.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)