2013-07-22 108 views
3

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

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 = ";") 

,我特别希望检查代码列相匹配,因为我需要这些值来比较他们对我在别处存储一些文件。但是,当我将这些文件与Tekst文件(以及Excel中的单元格值)进行比较时,使用options(digits = 19);

Ex$CODE 
[1] 871685920001760384 871685920001765760 871685920001804288 

正如你所看到的,这些值根本不匹配!试图as.character()给出相同的结果:

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

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

在此先感谢!

+0

通常情况下,CSV文件格式为“一个”,“两个”,“三个”。我会检查Excel中导出的设置。 – BigBadOwl

+0

您是否尝试过使用read.csv而不是read.csv2? –

回答

8

您可以通过设置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" 
+0

很棒!那很简单!谢谢! –

+0

@ Tim.Lucas请参阅James为什么会发生这种情况的解释。看看'?.Machine'获取更多信息 –

5

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

此为R如何解释该值:

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

双打携带的精度53个比特的数,其比10^16少一点。你的电话号码差不多是10^18,因此它不能完全代表单位级别。

+0

好吧,谢谢你的解释!请记住这一点。 –