【问题标题】:R not importing csv file correctlyR没有正确导入csv文件
【发布时间】:2013-07-22 13:21:38
【问题描述】:

我对 R 有一个奇怪的问题。它没有正确导入我从 Excel 导出的 csv 文件。我有以下 csv 文件(我检查了文本格式是否与 Excel 中的单元格值相同):

REGION;TYPE;CODE;BILL
A;X;871685920001760387;003007614504
B;Y ;871685920001765726;003007638434
C;Z;871685920001804326;003211001858

以上是我的 csv 文件的内容。我将其保存为“Example.csv”。现在我想将此文件导入 R:

Ex <- read.csv2("Example.csv", header = TRUE, sep = ";")

现在,我特别想检查 CODE 列是否匹配,因为我需要这些值来将它们与我存储在其他地方的一些文件进行比较。但是,当我将这些文件与 tekst 文件(以及 Excel 中的单元格值)进行比较时,使用 options(digits = 19);

Ex$CODE
[1] 871685920001760384 871685920001765760 871685920001804288

如您所见,这些值根本不匹配!尝试as.character() 会得到相同的结果:

as.character(Ex$CODE)
[1] "871685920001760384" "871685920001765760" "871685920001804288"

有谁知道如何解决这个问题?我也试过stringsAsFactors = FALSE,但没用。

提前致谢!

【问题讨论】:

  • 通常 CSV 文件的格式为“一”、“二”、“三”。我会检查 Excel 中的导出设置。
  • 您是否尝试过使用 read.csv 而不是 read.csv2?

标签: r csv import


【解决方案1】:

您可以通过设置colClasses 将它们全部读取为字符。

 > Ex = read.table("Example.csv", sep  = ";", header = TRUE, colClasses = "character")
 > Ex
   REGION TYPE               CODE         BILL
 1      A    X 871685920001760387 003007614504
 2      B   Y  871685920001765726 003007638434
 3      C    Z 871685920001804326 003211001858
!> sapply(Ex, class)
      REGION        TYPE        CODE        BILL
 "character" "character" "character" "character"

【讨论】:

  • 效果很好!那很简单!谢谢!
  • @Tim.Lucas 请参阅 James 对为什么会发生这种情况的解释。查看?.Machine了解更多信息
【解决方案2】:

@JakeBurkhead 给出了解决方案,但发生这种情况的原因是read.csv 默认情况下会将值解释为numericnumeric 的值受浮点运算规则的约束,尤其是 doubles 的规则。

这是 R 解释值的方式:

print(871685920001760387,digits=18)
[1] 871685920001760384

双精度数的精度为 53 位,略小于 10^16。您的数字几乎是 10^18,因此不能精确地表示为单位级别。

【讨论】:

  • 好的,谢谢解释!会记住这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 2018-10-29
  • 2019-04-15
  • 2018-11-22
  • 1970-01-01
  • 2023-01-26
相关资源
最近更新 更多