函数 write() 与数字符号不一致

Posted

技术标签:

【中文标题】函数 write() 与数字符号不一致【英文标题】:Function write() inconsistent with number notation 【发布时间】:2018-02-06 17:15:31 【问题描述】:

考虑以下脚本:

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】:

这不是错误,R 选择了最短的表示。

更准确地说,?options 可以阅读:

固定符号将是首选,除非它超过scipen 数字更宽。

所以当scipen 为0(默认值)时,首选最短的表示法。

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

在你的情况下:

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() 时间不一致

sprintf转换类型和参数类型必须一致么

对比两张Excel表数据差异时,遇到数据雷响不一致

一致性哈希的分析与实现

一致性哈希的分析与实现

Big Query 着陆页数字与 Google Analytics 界面不一致