この記事は、Rのプログラミングが、ウェブサイト上などで調べて自分で書けるようになることを目指しているシリーズの記事です!前の記事ではRのプログラミングコードの基本構造を作っている基本コードの紹介をしたよ!
今回の記事では、データの型と構造を紹介しよう!サンプルコードが読めるようになるまでもう少しだよ!あとちょっと頑張ろう!
がんば!
データの型ってなに?
まずは、データの型の話からしよう!僕たちがRを使って解析するデータにはいろいろな種類のデータがあるんだ!例えば肥満に関する調査を行う場合を考えてみよう、下記のようにいろいろな結果の表し方ができる!
体重(kg, 連続変数) | 55 kg | 75 kg |
肥満症リスク(離散変数) 0: やせ型 1: 普通 2: 肥満型 | 1 | 2 |
体格(文字列) | ふつう | ぽっちゃり |
よくこんなデータがあるよね?
これを見ると体重の55kgと75kgは大きいか小さいかの比較できるけれど、肥満症のリスクでは、数字の大小を単純比較してもあんまり意味がないよね!これは、あくまでも肥満症のリスクを0, 1, 2の数字に置き換えているだけだからね!同じように体格はそもそも結果が数字じゃあないので、これも解析は別の方法になるよね?
こんな感じで、素データには色んな種類が散乱していることがよくあるんだ!このデータの種類を “データ型” とRでは呼ぶよ!
Rで解析をするときに、初心者がクセにして欲しいことの一つは、データの型を確認すること!だって、データの型が違うとそもそも解析方法だって変わることがあるから。当たり前だよね?
でも、これが原因で解析でエラーが起こることは、しょっちゅうあるんだ!
適切な統計解析をするためにも、データの型を確認することがたいせつなんだね~!
データの型を確認する方法
str関数(まずはこれ!)
まずデータの型を確認するシンプルな方法がstr関数!たとえば、irisというサンプルデータを使ってデータの型を調べるとしたら、
str(iris)
'data.frame': 150 obs. of 5 variables: $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ... $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ... $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ... |
出力された結果がちょっと複雑なんだけど、列名($ Sepal.Lengthとかのこと)の後にかいてある “num” や “Factor” がデータの型をあらわしているんだ。
ちなみに、str関数はオブジェクト全体の構造を確認するときにも使うとっても便利な関数だから覚えておくといいよ!
個別の列の型を知りたかったら、下記のように "$" マークや "[ ]" を使って列を指定するといいよ!(列の指定とか、良く分からないっていう人はこの記事を読んでね!)
str(iris$Sepal.Length)
str(iris[,1])
num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... |
カンタンだね!
tibble関数(こっちを使うことが多い!)
つぎにもう一つデータの型を確認できるtibble関数を紹介するよ!
install.packages(“tidyverse”)
library(tidyverse)
tibble(iris)
# A tibble: 150 x 5 Sepal.Length Sepal.Width Petal.Length Petal.Width Species <dbl> <dbl> <dbl> <dbl> <fct> 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3 1.4 0.2 setosa 3 4.7 3.2 1.3 0.2 setosa 4 4.6 3.1 1.5 0.2 setosa 5 5 3.6 1.4 0.2 setosa 6 5.4 3.9 1.7 0.4 setosa 7 4.6 3.4 1.4 0.3 setosa 8 5 3.4 1.5 0.2 setosa 9 4.4 2.9 1.4 0.2 setosa 10 4.9 3.1 1.5 0.1 setosa # ... with 140 more rows |
このtibble関数はdplyrというパッケージに含まれるモダンなデータフレームを作る関数を使って確認しているんだ。要はもともとRで仕えるデータフレーム(表)とは別の形式(だけど大体一緒)のデータのハンドリングがしやすい表に変換する関数のこと。
このtibble関数で表を作ると、出力した時に最初に行数×列数が出力されて、列名の次の行にデータの型、そして最初の10行が出力されるよ。このtibble関数の良い所は、表に含まれているデータも確認しながら、データの型が確認できるところ!一般的には、データの確認をするときには、どんなデータなのか、中身も確認しておきたいので、tibble関数はおススメだよ!
dplyrというパッケージを使う必要があるけれど、サンプルコードではtidyverseというパッケージを読み込んでいます。tidyverseはメタパッケージといって、dplyr、tidyr、ggplot2など基本的なデータ操作や図の描画に必要なパッケージが複数まとまっているパッケージなんだ!
それじゃあ、データの型を紹介していくよ!
Rのデータ型(numeric, character, factor, logical)
numeric (integer, double)
はじめは “numeric” 。要するに数字だ!数字の中でも、整数(integer)と実数(double)で分かれるけれど、そこは多くの場合、あまり重要ではないので最初は、数字ってことがまずは大事だよ!
なんでかって言うと、数字は計算ができるから!(そのまんま!)
character (factor)
つぎは “character” 。文字列だよ~。character型のデータは参加者のID番号、地名などさまざまだけど、ポイントは計算できないってこと!ただ、character型のデータも数えることはできるから、統計処理の変数やアウトカムにはなるからね!
ちなみにcharacter型のデータの中に、factor型と言うものがあって、これは文字列に加えて大小や順序があるものをいうんだ!例えばcharacter型データでBad, Good, Bestというデータがあったら、これは明らかにBad, Good, Bestっていう順番(もしくはその逆)だよね?Bad, Best, Goodっていう辞書順にならないように、factorを使うといいよ!
# "character"型のデータに順序を付ける方法
x <- c(“Bad”, “Good”, “Best”)
x <- factor(x, ordered = TRUE, levels = c(“Bad”, “Good”, “Best”))
その他の型
その他にも色々な型があるよ!複素数のcomplex型。TRUE, FALSEなどの論理値を表すlogical型。日付を表すDate型など。この当たりのデータも使うことはあるけれど、先ずはnumericとcharacterの型をしっかりと頭に入れておこう!
データ型のまとめ
データの型を確認しないといけない理由
データの型はめっちゃくちゃ重要で、初めのうちは細目に確認をしておくことが大切だよ。なんでかって言うと、気付いたら思っていたのと違う型だったせいで解析が上手くいかなかったって言う苦労をみんな通っているから。みんな痛い目にあいながらデータの型を確認するのが大事なんだって言うことが分かってくるんだ!
特に、数字だと思っていたら、何かが原因でcharacter型になっていたなんて言うことが本当によくあるんで気をつけよう!
つぎにデータ構造について紹介するよ。データ構造はデータ型とセットで理解すべき大事な情報だから、良く分からないよ!って人は必ず読んでね!
データ構造ってなに?
データ構造を確認する方法
つぎはデータ構造を覚えよう!データ構造というのは、表や行列などのようなデータのかたまりの構造のことだよ!データ構造の細かい説明は一旦とばして、まずはデータ構造の確認方法を教えるね。
データ構造を調べるには、class関数を使うんだ。class(オブジェクト名) でデータの型が出てくるよ!試しに、おなじみになってきた、Rのサンプルデータirisのデータ構造を調べてみると、下記のようになるよ。
class(iris)
[1] "data.frame" |
これは、”data.frame” って出てきたので一発で分かるよね!他には、データ型を調べる方法でも出てきたstr関数でもデータ構造が分かるんだ!
str(iris)
'data.frame': 150 obs. of 5 variables: $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ... $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ... $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ... |
ここでも、一番最初の行に “data.frame” :150 obs. of 5 variablesって出てきて、150行、5列のデータフレームだって一発で分かるね!strはさっきも説明した通り、データの型も確認することができるので、オブジェクト全体の中身を確認しておきたいときにはオススメだよ!でもビッグデータになってくると出力される結果が大きくなりすぎるので、そこは臨機応変にclass関数とstr関数を使い分けよう!
それじゃあ、実際にどんなデータ構造があるのか紹介していくよ!
データ構造(data.frame, matrix, listなど)
データフレーム(data.frame)
まず最初に覚えておきたいのがこのデータフレーム!普通の表のことだよ!一番、すんなりとイメージもできるのがデータフレームだと思うので、解析の時のメインデータはデータフレームになることが多いと思うよ!
行列(matrix)
つぎは行列!基本的には表のデータを行列計算したい場合などに使うんだ!でも初心者は行列計算のために行列を使うことはほとんどないと思うよ!じゃあ、どんな時に行列を使うのかっていうと、それは、行と列を入れ替えるとき。ちなみに行と列を入れ替えるときの関数は t関数。たとえば、irisの初めの5行2列を取り出して、行と列を入れ替えてみると次のようになるよ。(ちょっとコードを書いて行くけれど、何となくついてきて)
x <- iris[1:5, 1:2] # irisの初めの5行2列にxという名前を付ける
x
Sepal.Length Sepal.Width 1 5.1 3.5 2 4.9 3.0 3 4.7 3.2 4 4.6 3.1 5 5.0 3.6 |
tx <- t(x) # xの行と列を入れ替えてtxと名前を付ける
tx
1 2 3 4 5 Sepal.Length 5.1 4.9 4.7 4.6 5.0 Sepal.Width 3.5 3.0 3.2 3.1 3.6 |
すると、2行、5列で出力されるでしょ?この時に実は行列計算で変換されているので、データの構造がデータフレームから行列に変わってしまうんだ。また、この時に気をつけて欲しいのは、行列のデータは中の値が全て同じ型で構成されているということ!実際にclass関数でデータ構造を確認すると下記の通り、matrixとなっているね!
class(tx)
[1] "matrix" "array" |
“matrix” の他に ”array” とも出てくるけれど、これは3次元以上の行列も扱えるデータ構造のことだけど、ほとんど使うことはないので無視してOKだよ!
リスト(list)
つぎはリスト。これはちょっと分かりにくいけれど、色々なデータが集まったかたまりのコト。データフレームや行列みたいに2次元で見ることができないんだけど、リストの中には表やデータがいくつも含まれていたりするんだ。たとえば、通知表というリストの中に1学期、2学期、3学期みたいな3つの表を入れたりできるよ!(そう言われると便利じゃない?)
リストに含まれるデータフレームなどを取り出すには”$”マークを使うほかに、二重括弧 “[[]]” を使って取り出すことができるんだ。個人的には”$”マークを使うことが多いかな~。
リストを作るときにはlist関数を使うよ。サンプルデータのBODとirisをそれぞれa, bという名前を付けたリストを作る場合には下記のような感じ。
x <- list(a = BOD, b = iris)
このデータのうちBODだけを出力したいときには、$aや[[1]]をつかうと出力されるよ。
x$a
x[[1]]
Time demand 1 1 8.3 2 2 10.3 3 3 19.0 4 4 16.0 5 5 15.6 6 7 19.8 |
tibble
さいごにtibbleというデータ構造を紹介するよ。これはdplyrというRのパッケージを使う必要があるので、もともとRに含まれているデータ構造ではないんだけど、どうしても必要になることがあるので、一緒に紹介するね。tibbleというデータ構造は基本的にはいわゆる表とおんなじ。つまりデータフレームとそんなに変わらないから、モダンなデータフレームなんて言われるよ。
普通のデータフレームはクラシックなデータフレームになるのかな?(知らないけど)
で、このtibbleというデータ構造になっていると、データのクリーニングや形の変換などがスムーズに行えるというメリットがあるので、とっても便利なんだ!その他にも、tibbleのデータは表示したときに、データの型なども表示されるのでオブジェクト全体を確認するときにも便利だよ!慣れるまで、ちょっと敬遠しがちだし、多くの場合はもともとのRで使えるベース関数で代用可能なんだけど、できるだけtibbleに慣れておくといいのかな?とは思います。
"diplyr" というパッケージを読み込んでもOKだけど、"tidyverse" というメタパッケージ(複数のパッケージがセットになったパッケージ)に含まれているので、こっちをインストールするのがおすすめ!
install.packages("tidyverse")
library(tidyverse)
x <- tibble(iris)
x
# A tibble: 150 x 5 Sepal.Length Sepal.Width Petal.Length Petal.Width Species <dbl> <dbl> <dbl> <dbl> <fct> 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3 1.4 0.2 setosa 3 4.7 3.2 1.3 0.2 setosa 4 4.6 3.1 1.5 0.2 setosa 5 5 3.6 1.4 0.2 setosa 6 5.4 3.9 1.7 0.4 setosa 7 4.6 3.4 1.4 0.3 setosa 8 5 3.4 1.5 0.2 setosa 9 4.4 2.9 1.4 0.2 setosa 10 4.9 3.1 1.5 0.1 setosa # ... with 140 more rows |
こんな感じで、データの型が表示されて、150行のirisのデータも、最初の10行だけ表示されるのがtibble形式のデータの特徴。すっきりと見やすくなっているので、データ全体をイメージしやすいね。
その他のデータ構造
主なデータ構造はこんなところ。他には、ちょっとだけ出てきたけれど、array(配列), vector(ベクトル), table(表)などがあるけれど基本的にはdata.frame, matrix, listなどを利用するのであまり気にしないで大丈夫!まずは、class関数を使ってデータ構造を確認することと、データフレーム、行列、リストのイメージをつかんでいればそれでOKだよ!
データ構造のまとめ
この記事はここまで!ここまで丁寧に読んでくれた人は、なんとなくRのイメージがわいてきたかな?もう少しでプログラミングの基本を紹介するのであとちょっと頑張ろう!次の記事ではデータの特徴をざっと把握するための基本関数を紹介するね!