【问题标题】:Scientific notation issue in RR中的科学记数法问题
【发布时间】:2015-01-13 09:59:15
【问题描述】:

我有一个 20 位数的 ID 变量。一旦我读取 R 中的数据,它就会更改为科学记数法,然后如果我将相同的 id 写入 csv 文件,则 ID 的值会发生变化。

例如,运行下面的代码应该将 x 的值打印为“12345678912345678912”,但它会打印“12345678912345679872”:

代码:

options(scipen=999)

x <- 12345678912345678912

打印(x)

输出:

[1] 12345678912345679872

我的问题是:

1) 为什么会这样?

2) 如何解决这个问题?

我知道这与 R 中数据类型的存储有关,但我仍然认为应该有一些方法来处理这个问题。我希望我对这个问题很清楚。

我不知道是否有人问过这个问题,所以如果它是重复的,请指向我的链接。我将删除此帖子

我已经通过this,所以我可以解决我的问题,但我无法解决它。

任何帮助将不胜感激。谢谢

【问题讨论】:

  • 为什么不将变量格式化为字符?
  • 我的意思是“以前”格式化它,就像当你导入数据时,你可以为 ID 变量指定字符 colClasses(这样的做法 x
  • 这个数字太大了,不能用整数表示。因此,它被表示为一个双精度,这导致issues with floating point number accuracy。 R 中有possibilities to use big integers,但由于您的数字是 id,您应该遵循 CathG 的建议并将它们视为字符串。
  • @CathG 是的,它有效,这就是我现在的做法:read.csv("file.csv",colClasses=c("character",rep(NULL,1))) as我只有两列(ID 和值)。谢谢,顺便说一句,你可以把你的想法作为答案,我很乐意接受你的回答。
  • 不错不错。我猜你的第二列是数字?所以你宁愿做 colClasses=c("character","numeric") (顺便说一句,如果你只重复一次,就不需要使用rep ;-))

标签: r


【解决方案1】:

R 默认不处理大于2147483647L 的整数。

如果您将L 附加到您的号码(告诉R 它是integer),您会得到:

x <- 12345678912345678912L
#Warning message:
#non-integer value 12345678912345678912L qualified with L; using numeric value 

这也解释了最后一位数字的变化,因为 R 将数字存储为 double

我认为gmp-package 通常应该能够处理大量数据。因此,您应该接受精度损失,将它们存储为字符串,或者使用 gmp 包中的数据类型。

【讨论】:

  • 感谢您分享您对 gmp 包的看法和诀窍。
【解决方案2】:

为了避免由于数字存储/表示引起的问题,您可以使用选项 colClasses 直接将 ID 变量导入为字符,例如,如果使用 read.csv 并导入带有 @987654324 的 data.frame @ 列和另一个数字列:

mydata<-read.csv("file.csv",colClasses=c("character","numeric"),...)

【讨论】:

    【解决方案3】:

    使用readr 你可以做到

    mydata <- readr::read_csv("file.csv", col_types = list(ID=col_character()))
    

    其中“ID”是您的 ID 列的名称

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-24
      • 2022-01-15
      • 2013-06-27
      • 2021-05-01
      • 1970-01-01
      • 2013-04-27
      • 1970-01-01
      相关资源
      最近更新 更多