函数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,因此更短)
  • 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)

以上是关于函数write()与数字表示法不一致的主要内容,如果未能解决你的问题,请参考以下文章

C write() 时间不一致

一致性哈希的分析与实现

一致性哈希的分析与实现

系统函数的应用

Python图像resize前后颜色不一致问题

Django orm字符串与数字比较导致数据不一致