在R中导入csv文件/从整数转换为double的问题

时间:2011-12-05 06:43:41

标签: r

今天我终于决定开始攀登R陡峭的学习曲线。我花了几个小时,我设法导入我的数据集,并做了一些其他基本的事情,但我遇到了数据类型的问题:包含小数的列导入为整数,并且转换为double会更改值

在尝试将一个小的csv文件放在这里作为一个例子我发现问题只发生在数据文件太大时(我的原始文件是1048418×12矩阵,但是即使只有“5000”行,我也有同样的问题。当我只有100行,1000行甚至2000行时,列被正确导入为double)。

Here是一个较小的数据集(仍然是500kb,但同样,如果数据集很小,则不会复制问题)。代码是

> ex <- read.csv("exampleshort.csv",header=TRUE)
> typeof(ex$RET)
[1] "integer"

为什么当文件很大时返回的列被导入为整数,当它显然是double类型时?

最糟糕的是,如果我尝试将其转换为double,则值会更改

> exdouble <- as.double(ex$RET)
> typeof(exdouble)
[1] "double"

> ex$RET[1:5]
[1] 0.005587  -0.005556 -0.005587 0.005618  -0.001862
2077 Levels: -0.000413 -0.000532 -0.001082 -0.001199 -0.0012 -0.001285 -0.001337 -0.001351 -0.001357 -0.001481 -0.001486 -0.001488 ... 0.309524

> exdouble[1:5]
[1] 1305  321  322 1307   41

这不是唯一导入错误的列,但我想如果我找到一个列的解决方案,我应该能够将其他列排序。以下是一些更多信息:

> sapply(ex,class)
PERMNO      DATE    COMNAM     SICCD       PRC       RET      RETX    SHROUT    VWRETD    VWRETX    EWRETD    EWRETX 
"integer" "integer"  "factor" "integer"  "factor"  "factor"  "factor" "integer" "numeric" "numeric" "numeric" "numeric" 

它们应按以下顺序排列:整数,日期,字符串,整数,双精度,双精度,双精度,整数,双精度,双精度,双精度,双精度数(类型可能不对,但希望你能理解我的意思)< / p>

1 个答案:

答案 0 :(得分:7)

请参阅read.csv的帮助:?read.csv。以下是相关部分:

colClasses: character.  A vector of classes to be assumed for the
          columns.  Recycled as necessary, or if the character vector
          is named, unspecified values are taken to be ‘NA’.

          Possible values are ‘NA’ (the default, when ‘type.convert’ is
          used), ‘"NULL"’ (when the column is skipped), one of the
          atomic vector classes (logical, integer, numeric, complex,
          character, raw), or ‘"factor"’, ‘"Date"’ or ‘"POSIXct"’.
          Otherwise there needs to be an ‘as’ method (from package
          ‘methods’) for conversion from ‘"character"’ to the specified
          formal class.

          Note that ‘colClasses’ is specified per column (not per
          variable) and so includes the column of row names (if any).

祝你学习R好运。这很困难,但是在你经历了前几个阶段(我承认确实需要一些时间)之后会非常有趣。

尝试这个并相应地修复其他人:

ex <- read.csv("exampleshort.csv",header=TRUE,colClasses=c("integer","integer","factor","integer","numeric","factor","factor","integer","numeric","numeric","numeric","numeric"), na.strings=c("."))

正如BenBolker指出的那样,可能不需要colClasses参数。但请注意,使用colClasses参数可以使操作更快,尤其是对于大型数据集。

必须指定

na.strings。请参阅?read.csv中的以下部分:

 na.strings: a character vector of strings which are to be interpreted
      as ‘NA’ values.  Blank fields are also considered to be
      missing values in logical, integer, numeric and complex
      fields.

供参考(不应将其用作解决方案,因为最佳解决方案是在一个步骤中正确导入数据): RET未作为整数导入。它是作为factor导入的。如果您想将factor转换为numeric,请使用

以供将来参考

new_RET <-as.numeric(as.character(ex$RET))