- なんで""があったりなかったりするの
- matrix?data.frame?何が違うの
- stringsAsFactors = FALSEというおまじないは何をしてるの
数年Rを使ってきましたけど、この辺よくわかってなくて、何となく使えてはいるものの、時々エラーの理由がよくわからなくて悩まされたりしてました。
このたびRstudioを導入するにあたり『RStudioではじめるRプログラミング入門(Garrett Grolemund著)』を読んだら全部スッキリしたという話。
1. なんで""があったりなかったりするの
例えばRで次のようなコードを打つと
plot(sin, from=0, to=2, ylim=c(0,1), ylab="")
par(new=TRUE)
plot(cos, from=0, to=2, col="red", ylim=c(0,1), ylab="")
「0」とか「2」や「TRUE」は裸なのに、ylabの中身とか「red」はなぜ「"(ダブルクオート)」で囲まなければならないのか?
そういうのが作法だからといえばそれまでなんですが、どうしてそういう作法になっているのかがわからないと、書き忘れたり、余計なとこに書いたりしてエラーの原因になります。
じゃあなぜなのかというと、データの型の違いによるものです。
Rの世界では「"」で囲まれた文字を「文字列」として扱います。
その他は「数値」です。
(ちなみに「TRUE」、「FALSE」は「論理値」という特別な数値で「TRUE = 1」、「FALSE = 0」に値します。)
なので、""がつくかつかないかは、文字列を指定すべきか、数値を指定すべきかで決まるのですね。
データの型はtypeof()関数を使えば調べられます。
typeof(TRUE)
[1] "logical"
型の種類には倍精度浮動小数点"double"、整数"integer"、文字"character"、論理値"logical"、複素数"complex"、raw"raw"があります。
2. matrix?data.frame?何が違うの
matrix(行列)とはこんなデータです
1 | 152 | 48 |
1 | 158 | 50 |
1 | 163 | 53 |
2 | 165 | 59 |
2 | 180 | 72 |
data.frame(データフレーム)とはこんなデータです
女性 | 152 | 48 |
女性 | 158 | 50 |
女性 | 163 | 53 |
男性 | 165 | 59 |
男性 | 180 | 72 |
よく似てますね。でも全く違います。
matrixは同じ型のデータでできた行列です。
一方data.frameは別の型のデータが混じった(ただしひとつの列の中では同じデータ型のみの)表です。
matrixはベクトルと同じようにそのオブジェクトに対して演算ができます。
data.frameはそういう自由な演算はできませんが、より自由な形式のデータを持つことができます。
matrixはこんな感じで作ります。
sex <- c(1,1,1,2,2)
height <- c(152,158,163,165,180)
weight <- c(48,50,53,59,72)
data1 <- matrix(c(sex, height, weight), ncol=3)
data1
[,1] [,2] [,3]
[1,] 1 152 48
[2,] 1 158 50
[3,] 1 163 53
[4,] 2 165 59
[5,] 2 180 72
data.frameはこんな感じです。
sex2 <- c("女性","女性","女性","男性","男性")
height <- c(152,158,163,165,180)
weight <- c(48,50,53,59,72)
data2 <- data.frame(sex2, height, weight)
data2
sex2 height weight
1 女性 152 48
2 女性 158 50
3 女性 163 53
4 男性 165 59
5 男性 180 72
ファイルからデータを読み込むときは、自分が作りたいデータはmatrixなのかdata.frameなのか意識しないと、うまく読み込めなかったり、その後の計算でエラーが起きたりします。
ちなみに1行だけのdata.frameをlistと呼びます。
3. stringsAsFactors = FALSEというおまじないは何をしてるの
データをファイルから読み込むとき、
data <- read.csv("data.csv", stringsAsFactors = FALSE)
のようにstringsAsfactorsのオプションをFALSE(短縮して「F」でも可)にした方が良いと、色々なTipsに書いてあります。
Rでデータ読み込みから前処理までのTips
R:read.csv / read.tableで型と列名を指定して読み込む。
時には「おまじないのようにとにかくstringsAsfactors = FALSEと書くべし」などと書かれたりしてますが、実際には何をしてるんでしょうか?
「stringsAsfactors」とは読んで字のごとく「文字列をファクタとみなす(変換する)」という事をやってくれるオプションで、デフォルトは「TRUE」になっています。
この引数を「FALSE」にするという事は、すなわち「文字列をファクタに変換しない」という事です。
ファクタって何でしょうか?「文字列をファクタにしない」と何が良いのでしょうか?
ファクタとはカテゴリ情報を格納するための手段で、factor()関数にベクトルを渡すと、データを整数として符号化し、整数ベクトルにその結果を格納します。同時にファクタの値を表示する時に使われるラベルを格納するlevels属性とfactorクラスを格納するclass属性をその整数に追加します。
実際にファクタを作ってみましょう。
sex3 <- factor(c("女性","女性","女性","男性","男性"))
文字列をファクタとして格納してみました。
typeof()で中身を見てみると
typeof(sex3)
[1] "integer"
整数が格納されていることがわかります。
属性を調べるattributes()関数を使ってみると
attributes(sex3)
$levels
[1] "女性" "男性"
$class
[1] "factor"
「女性」「男性」をラベルにしてクラス属性はファクタとなったことがわかります。
実際にどのような整数で格納されたかはunclass()でわかります。
unclass(sex3)
[1] 1 1 1 2 2
attr(,"levels")
[1] "女性" "男性"
のようにレディファーストで格納されてました。
ファクタを使うと文字列が数値にコード化されるため、カテゴリ変数を統計モデルに導入するのに便利です。一方、ファクタは文字列のように見えるのに整数のようにふるまうため紛らわしくなります。
なので、データを読み込む際にはファクタ化せず、必要に際してファクタ化した方がエラーの原因が減らせるのですね。
これがおまじないの意味です。
以上、
『RStudioではじめるRプログラミング入門』は読みやすく、短時間でR、Rstudioに慣れ親しむのに向いています。
また、R使ってるんだけど、何となくモヤモヤする人の再入門にも向いています。