【问题标题】:Problems importing csv file/converting from integer to double in R导入 csv 文件/在 R 中从整数转换为双精度的问题
【发布时间】:2011-12-05 06:43:40
【问题描述】:

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

在尝试获取一个小的 csv 文件作为示例时,我发现 只有当数据文件太大时才会出现问题(我的原始文件是 1048418 x 12 矩阵,但是即使“只有”5000 行我也有同样的问题。当我只有 100、1000 甚至 2000 行时,该列被正确导入为双精度)。

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

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

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

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

> 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" 

它们的顺序应该是:整数、日期、字符串、整数、双精度、双精度、双精度、整数、双精度、双精度、双精度、双精度(类型可能是错误的,但希望您能明白我的意思)

【问题讨论】:

  • @Xu Wang:上半场不行。将其减少到前 5000 次观察,不到我数据的 1%,已经产生了问题......
  • 很抱歉我没有完成我的评论,因为我去阅读了read.csv 帮助。我想说的是,我认为可能有一些奇怪的值让R 感到困惑。所以我认为这不是大小的事实,而是大型数据集具有那些令人困惑的字符或值之一。那有意义吗?如果没有,那也没关系。我认为解决方案是使用 colClasses 参数。
  • @Xu Wang 我明白你在说什么,但我仍然不太确定如何解决我的问题。如何使用 colClasses 参数?您能否给我一行命令以使用 colClasses 参数正确导入此文件?
  • 相信我们可以解决这个问题!请在答案中查看我的评论。我需要你提供一些其他信息。

标签: r


【解决方案1】:

请参阅 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 &lt;-as.numeric(as.character(ex$RET))

【讨论】:

  • 我已经阅读了这部分帮助,但我真的不明白这一切意味着什么(我今天才开始使用 R)。该列只有 0 或双精度值,并且没有缺失值。
  • 啊,好的。数据集中的其他列应该是什么?他们进口好吗?你能发布sapply(ex,class)的输出吗?
  • 我将您要求的信息添加到我的问题的末尾
  • 太棒了,我的荣幸!这实际上是 R 中非常好的(虽然很痛苦)的一课。另外,我知道帮助文件可能会令人困惑,但它们真的很好。尝试通读它们,当您遇到困难时,请随时提出诸如“R 中的因子是什么意思”之类的问题?此外,还有很棒的书籍和免费介绍。我建议通过一个工作。祝你好运!
  • 我认为typeof 让您感到困惑。 class(ex$RET) 可能会让你早点得到答案……我认为你甚至不需要colClasses,只需要na.strings 参数。 ex &lt;- read.csv("exampleshort.csv",header=TRUE,na.strings=".") 似乎对我有用。
猜你喜欢
  • 1970-01-01
  • 2016-01-01
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-13
  • 2014-04-18
  • 2017-09-29
相关资源
最近更新 更多