LoginSignup
12
21

More than 1 year has passed since last update.

Rのよくわかってなかったところ[(超入門向け)型とかデータ構造とか]

Last updated at Posted at 2017-10-30
  1. なんで""があったりなかったりするの
  2. matrix?data.frame?何が違うの
  3. 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="")

Rplot.png
こんな図を描いてくれるのですが、

「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はこんな感じで作ります。

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はこんな感じです。

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というおまじないは何をしてるの

データをファイルから読み込むとき、

strigsAsFactors
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属性をその整数に追加します。

実際にファクタを作ってみましょう。

make factors
sex3 <- factor(c("女性","女性","女性","男性","男性"))

文字列をファクタとして格納してみました。
typeof()で中身を見てみると

is integer?
typeof(sex3)
[1] "integer"

整数が格納されていることがわかります。

属性を調べるattributes()関数を使ってみると

check attributes
attributes(sex3)
$levels
[1] "女性" "男性"
$class
[1] "factor"

「女性」「男性」をラベルにしてクラス属性はファクタとなったことがわかります。

実際にどのような整数で格納されたかはunclass()でわかります。

unclass
unclass(sex3)
[1] 1 1 1 2 2
attr(,"levels")
[1] "女性" "男性"

のようにレディファーストで格納されてました。

ファクタを使うと文字列が数値にコード化されるため、カテゴリ変数を統計モデルに導入するのに便利です。一方、ファクタは文字列のように見えるのに整数のようにふるまうため紛らわしくなります。
なので、データを読み込む際にはファクタ化せず、必要に際してファクタ化した方がエラーの原因が減らせるのですね。
これがおまじないの意味です。

以上、
RStudioではじめるRプログラミング入門』は読みやすく、短時間でR、Rstudioに慣れ親しむのに向いています。
また、R使ってるんだけど、何となくモヤモヤする人の再入門にも向いています。

12
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
21