【问题标题】:Function write() inconsistent with number notation函数 write() 与数字符号不一致
【发布时间】: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)

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

【问题讨论】:

    标签: r formatting scientific-notation


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      相关资源
      最近更新 更多