49  Parseの落とし穴(L53)

ここでは、例として、import_practice2.txt(,で区切られているファイル。)を読み込んでいきます

読み込んだデータは適当な変数名(dat)に放り込んでおきます。

dat <- read_csv("import_practice2.txt")

色々と警告のメッセージが出ていますが、ここでは無視して。

dat

を実行すると最初の10行はこんな感じでした。

また、それぞれの列の型は、

col1_num: col2_char: col3_NumChar: col4_CharNum:

となっています。

うまく読み込めているように見えますが、ちょっとEnvironmentペーンの、datをクリックしてデータのビューワーを起動しましょう

一番下までスクロールすると、col3_NumChar列に、NAという記載がでてきます。

このNA、インポート時に、うまくパースできなかった結果、生じているもので、読み込み時にでてきていた

警告: 90 parsing failures.

というのは、うまくデータが変換できずに欠損値が発生していますよという意味です。

この事象、なぜ発生するかというと、自動パースは、デフォルトでは最初の1000行を見て判断するという形になっています。

このファイルは、意図的に1010行目から3列目に文字列を、4列目に数字を入れてあります。

なので、最初の1000行で3列目はすべて数字であったため、read_csv関数は、「3列目は数字として扱う」と決めたのに、1010行目から文字列が入ってしまい、境目で

parse_number(c(1,2,3,4,5,"a","b","c"))

このような処理が生じてしまい、結果、

[1] 1 2 3 4 5 NA NA NA

となったという状況です。

この事象を回避するためにはいくつかやり方があります

その1:自動的に判断する行数を増やす:

guess_maxというオプションで行を増やすことができます。

デフォルト

dat <- read_csv("import_practice2.txt", 
               guess_max = 1000)

tail(DT) #tailは最後の列を表示する関数

と、普通に読み込んだらこうですが、

guess_maxを増やす

dat <- read_csv("import_practice2.txt",
                 guess_max = 99999)

tail(dat)  #col3がきちんと<chr>となり、NAではなくなっています。

この方法のデメリット:事前に行数がわからない場合は値を何にすればよいかわからない。データによっては処理が重くなる

その2:列毎に型を指定してあげる。

データを眺めてある程度どのようなデータが含まれているか分かっている場合は、推測しないで、パースする型を直接していするような方法もとれます。

dat <- read_csv("import_practice2.txt",
               col_types="iccc")

tail(dat)

?read_csv
vignette("readr") #のAvailable column specification

に、設定できる型がたくさん記載されていますが、とりあえず、最初の段階ではi d cの3つくらいを抑えておいてください。

デメリット:事前にどの列にどんなデータが入っているか知っている必要ありそれでも、事故的に文字列が数値と思っている列に紛れ込んでいるケースではNAとなってしまう。

その3:全部文字列としてとりあえず読み込む

dat <- read_csv("import_practice2.txt",
               col_types=cols(.default="c"))

tail(dat)

デメリット:後々自分で型変換を必要に応じて行う必要がある

個人的には、どんなデータが含まれているかわからないようなケースではその3の方法を多用して読み込みを行っています。

もちろん、データがおかしなことになっていない可能性が高い、直接データベースから吐き出したファイル等を読み込む場合は、データベースにある型を指定して読み込んだりもしますが、

列の型変換、Section5のデータ加工を利用すれば、非常に簡単にできるので、インポート時点でデータが欠損することを避けることを重視しておくのが最初のうちは無難かと思います。。

お疲れさまでした。

以上で、駆け足でしたが、最低限のテキストファイルの読み込みについての解説でした。

次の動画からは、エクセルファイルの読み込みについて解説していきます