データ解析のスタートはデータの取り込みです。でも、意外とデータの取り込みは苦手としている人も多い場所の一つです。この記事ではエクセルなどからデータを取り込むときに手軽に行うことができるクリップボードを使ったデータの取り込みと、CSVファイルの読み方を紹介します。
“clipboard” でエクセルなどの表を読み込む方法
表などのデータを読み込むときに、初心者にとって一番カンタンで間違いがない方法は “clipboard” でデータを読み込む方法だと思っています。もちろん、これにはメリットもデメリットもあるので、後ほど説明をさせていただきますが、まずはクリップボードで表を読み込む方法を紹介しますね。
今回は例としてエクセルのデータを取り込みますね!データを選択してコピーをすると上の画像のように、緑の点線でクリップボード上に保存されるのが分かりますね。これを、Rで下記のコードを使って読み込むだけです。
read.table("clipboard", header = TRUE)
Rを出力すると下記のようになります!
> read.table("clipboard", header = TRUE)
時間軸.年次.コード 時間軸.年次. 都道府県.特別区.指定都市再掲.コード 都道府県.特別区.指定都市再掲.
1 2019000000 2019年 0 全国
2 2019000000 2019年 1000 北海道
3 2019000000 2019年 2000 青森県
4 2019000000 2019年 3000 岩手県
5 2019000000 2019年 4000 宮城県
6 2019000000 2019年 5000 秋田県
7 2019000000 2019年 6000 山形県
8 2019000000 2019年 7000 福島県
9 2019000000 2019年 8000 茨城県
10 2019000000 2019年 9000 栃木県
read.table( ) はデータフレームを読み込む関数で、 “clipboard” で読み込むデータをクリップボードに指定しています。その後の header = TRUE というコードはオプションで先頭の行を列の名前として読み込むように指定しています。とってもカンタンですね。
クリップボードを読むときによくあるエラー
CSVファイルの読み込みでも、クリップボードの読み込みでも良くあるのが、下記のエラーです。
line 1 did not have ~ elements |
これは、データの数が列の数とあっていないときにおこります。クリップボードを使うときは、エクセルなどでデータの確認ができる場合が多いと思いますので列の数とデータの数があっているか確認しましょう。
具体的には、下記のようなことがあるとクリップボードではエラーとなりやすいので注意しましょう。
- コピーしたセルに空のセルが含まれている
- 列の名前(項目の名前)にスペースが含まれている
空のセルが含まれているのは分かりやすいですよね。CSVファイルなどでは区切りの文字が指定できるので空のセルが含まれていても対処できるのですが、クリップボードではエラーになってしまいます。また、セルの文字列の中にスペースなどが含まれていると、誤って2つのデータとして読み込んでしまいエラーとなってしまいます。
ですので、データを読み込む前にこういった問題が起こらないように事前にクリーニング作業を行うのがポイントです。同じ理由でできるだけ列名などはシンプルな名前になるように直しておくと良いと思います。正直なところ、データの読み込みは事前のクリーニング作業が肝と言っても言い過ぎではありません!
クリーニング作業は結構大変だけど、めちゃくちゃ大事な作業だよ!
クリップボードを使うメリット・デメリット
クリップボードを使用する場合には、メリットもデメリットもはっきりしているので頭に入れておくと良いと思います。
メリット ・データを目視で確認しながら取り込むことができる ・CSVファイルの保存がない分、手軽にできる デメリット ・作業履歴が残らない ・再現性がない |
作業履歴が残らない、再現性がないというのもどちらも本質的には同じ問題ですね。読み込んだクリップボードの中身がなんだったのか、後からスクリプトを見ても分からないし、全く同じ作業が担保されないということです。
対処方法としては、スクリプトにエクセルのファイル名と読み込んだデータのシート名、セルの範囲などをスクリプトにテキストで残しておくなどするのが良いと思います。また、オブジェクトとして取り込んだ後に、Global environmentに名前を付けて保存するのもおすすめです。ですが、こういった問題を回避する一番手っ取り早い方法はクリップボードを使ったデータの取り込みは極力行わないということです。
ちなみに、わたしはRをはじめたばかりの頃はクリップボードがメインでしたが、今はこれから紹介するCSVファイルでの読み込みがメインです。
CSV形式のファイルの読み込み方
ファイルの事前クリーニング
では次に、CSVファイルの読み込みについて紹介します。そもそもCSVファイルって何?っていう人も結構いるのではないかなと思います。CSVファイルはデータをカンマで区切ったテキストベースのファイルのことを言います。基本的にはテキストベースのファイルなので、ほとんどのソフトで開くことができるのがメリットかなと思います。ちなみに、CSVは “Comma Separated Value” の略でカンマで区切られた値というそのままの意味です。
CSVファイルをエクセルで開くと下記のように、セルの装飾が一つもないシンプルなファイルが開かれます。でもちゃんとデータがセルで分かれていますね!ここがポイントです。
このようなCSVファイルをRで開く前に、まず必要なことは、項目となる行を1行目にすることです。上のファイルで行ったら、13行目が表の項目名になるので、1~12行目を事前に削除しておく必要があります。
上記画像のように1行目に項目が来て、2行目以降にデータが来るようになっていればOKです。次に、このCSVファイルをワーキングディレクトリに保存しましょう!
おそらく、ワーキングディレクトリという言葉が分かる人は少ないのではないかと思いますが、プロジェクトのメインフォルダだと思えばOKです!基本はプロジェクトを作成したらフォルダができて、そのフォルダがそのままワーキングディレクトリになると思います。
ワーキングディレクトリは
getwd()
というコードを動かすと確認することができます。
read.csv( )でCSVファイルを読み込む
CSV形式のファイルを読み込むときには、read.csv( ) というRのオリジナルの関数を使えばOK!1行目に項目が入っている場合には、header = TRUE で列名に指定することができます。
df <- read.csv("file_name.csv", header = TRUE)
もし、別のフォルダに入っているデータを読み込む場合にはファイル名の前にパスを作らなければいけません。パスの作り方は、WindowsとMacで異なりますが、基本的には同じです。
一番わかりやすいパスの作り方は先ほど紹介した getwd( ) で出てきた規則に従ってパスを作成するのが確実です。たとえば、下記のようになります。
getwd()
[1] "C:/Users/xxxxx/Documents/practice"
ここで出てきたパスを使ってCSVファイルを読み込むと下記のようになります。
df <- read.csv("C:/Users/xxxxx/Documents/practice/Sample.csv", header = TRUE)
getwd( ) で出てきたパスの後に同じように / を入れてから、ファイル名を書いています(Macではパスの書き方が異なりますが、パスの確認方法は同じです)。パスを作成するときにはエラーが付き物で、割と難しいです。私は基本的には読み込むCSVファイルはワーキングディレクトリに入れてパスを作らなくても良いようにしています。
CSVファイルの読み込みで起こるお決まりのエラー
ファイルを読み込むときによくおこるエラーをいくつか紹介します。
- ファイルのパスが間違っている
- 文字化けが起こる
- 元データがきたない
これらの問題に対して、明確にこうすればいいと言えることがあるわけではありません。文字化けが起こるときにはオプションで fileEncoding = “uft-8” と入れることで解決します。
read.csv("Sample.csv", header = TRUE, fileEncoding = "utf-8")
わたしの場合はファイルのパスでエラーが起こらないように、そもそもパスを作らなくてもよいように、ワーキングディレクトリ(プロジェクトのファイルが保存されているフォルダ)にCSVファイルを入れています。
最後に元データがきたないという問題ですが、この問題については、以下の3ステップでわたしはエラーの原因を探します。
- 完全にクリーニングができているファイルが読み込めるか確認する(パスの問題ではないかを確認)
- 最初の数行、数列だけのファイルを作って、読み込めるか確認する
- 目的のファイルが読み込めるか確認する
1ステップ目でエラーが起こる場合には、ファイルのパスやコードそのものに間違いがあると思ってください。昔に header = T と書いていたら “T” というオブジェクトを作っていたためにエラーになったことがありました。今思うととても間抜けですが、当時は全く気付かずにはまってしまいました。
2ステップ目でエラーが起こる場合には、元データに質的な問題がありそうです。特に列名で記号が多く使われていたり、日本語で書いている場合にはエラーになることが多いのでその場合には、列名を英語でシンプルなものに変更してみるとよいです。手っ取り早いのは列名を “a”, “b”, “c”,・・・とした上でもう一回読み込んでみると良いです。それでもエラーが出るようなら、一つ一つのセルに変なデータやブランクが混じっていないか確かめて、削除したり、書きかえてみるとよいです。とても地味なやり方ですが、うまくいかないときには、しらみつぶしにエラーの原因をチェックしていくしかないですから。
3ステップ目でエラーが起こる場合も2ステップ目と同じように問題をチェックしましょう。
CSVファイルは取り込んでリスト化がおすすめ!
最後に、取り込んだデータのまとめ方についてわたしのやり方を紹介します。わたしの場合には取り込んだデータは一度、リストにまとめます。エクセルでは、複数の表をシート1、シート2、シート3・・・みたいにシートを分けながら、1つのファイルにまとめますよね。それと同じ感じです。
まず、リストを作る関数は list( ) です。試しにRのサンプルデータ “iris” と “BOD” にそれぞれ、”df1”, “df2” と名前を付けて “data.list” という名前のリストを作ってみます。
data.list <- list(df1 = iris,
df2 = BOD)
これで data.list というリストの中に2つの表が入っていることになります。また df1 の表を出力したいときには data.list$df1 と$で指定すれば個々の表を取り出せます。($マークなど、基本コードがよく分からないときにはこちらの記事を見てください)
同じような感じで、CSVファイルからリストを作るときは下記のようなコードでリストを作っています。
data.list <- list(df1 = read.csv("Sample1.csv", header = T),
df2 = read.csv("Sample2.csv", header = T),
df3 = read.csv("Sample3.csv", header = T))
これで一つのリストの中に沢山の表が格納できるので、後から他のデータを見たいと思った時に、すぐに取り出すことができるようになります。よかったら試してみてください。