2011-12-05 3 views
6

今日、私は最終的にRの急な学習曲線を登り始めました。私は数時間を費やしてデータセットをインポートし、その他いくつかの基本的なことを行いましたが、データタイプに問題があります:小数点を含むカラムを整数としてインポートし、doubleに変換するとcsvファイルをインポートする際の問題/整数からdoubleへの変換を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 

を変更していること。これは間違ってインポートされた唯一の列ではありませんが、私は場合、私はのための解決策を見つけることを考え出し1つの列、私は他のものを並べ替えることができるはずです。ここではいくつかのより多くの情報がある:

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

彼らはこの順序である必要があります:整数、日付、文字列、整数、ダブル、ダブル、ダブル、整数、ダブル、ダブル、ダブル、ダブル(種類はおそらく間違っています、しかし、うまくいけば私が意味するものを得るでしょう)

+0

@Xu王を使用しています。私のデータの1%未満の最初の5千の観測値にカットすると、すでに問題が発生しています... – Vivi

+0

残念ながら、私は 'read.csv'のヘルプを読んで行ったので、私のコメントは終わりませんでした。私が言っていたことは、「R」を混乱させる奇妙な値があるかもしれないと思ったということでした。だから私は大小の事実ではなく、むしろ大規模なデータセットがその混乱する文字や値の1つを持っていると思った。それは理にかなっていますか?そうでない場合は、問題ではありません。私は解決策は、colClasses引数を使用することだと思います。 –

+0

@Xu Wang私があなたの言っていることを理解していますが、私はまだ自分の問題を解決する方法についてはあまりよく分かりません。 colClasses引数を使用するにはどうすればよいですか? colClasses引数を使用してこのファイルを正しくインポートする1​​行のコマンドを私に与えることができますか? – Vivi

答えて

6

read.csvのヘルプを参照してください:?read.csv。あなたは(私はいくつかの時間がかかるん認める)最初のいくつかの段階を過ぎて取得した後R.それの困難な、しかしとても楽しいを学ぶためにあなたの探求と

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). 

幸運:ここでは、関連するセクションです。

これを試してみて、それに応じて他の人を修正:

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を指定する必要があります。 (最善の解決策は、一の段階で正しくデータをインポートすることであるので、これは溶液として使用すべきではない)参考のために

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. 

?read.csvで次のセクションを参照 RETを整数としてインポートされませんでした。それはfactorとしてインポートされました。前半は動作しません。今後の参考のために、あなたはfactornumericに変換したい場合は、

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

+0

私は助けのこの部分を読んだが、正に、これが何を意味するのか理解していない(私は今日Rを使い始めたばかりだった)。その列は0またはdoubleの値しか持たず、欠損値もありません。 – Vivi

+0

ああ、大丈夫です。あなたのデータセットの他の列は何であるはずですか?彼らは大丈夫ですか? 'sapply(ex、class)'の出力を投稿できますか? –

+0

質問の最後にあなたが要求した情報を追加しました – Vivi

関連する問題