<< トップページへ

<< 目次へ

最終更新日: 2010.8.15

データフレーム



 色々なデータのまとめかた(データ形式)がありますが、データ解析を行う場合にはデータフレームを作成しておくことが原則となります。データフレームとは1つの変数が1列にまとめられたデータ形式であるといえます。例えば出席番号No.1の生徒について、国語の点数は80点、数学は90点、性別は男性。No.2は国語50点、数学70点、性別は女性。・・・といったようなデータは以下のようなデータフレームとしてまとめられるべきです。なお細かいことですが、表にまとめる場合、文字列は左寄せに、数値は右寄せに配置するのが基本です。また、コンピュータ上で扱う場合日本語(全角)は都合が悪いので、原則として変数名やラベルには英語(半角)を用いるようにしましょう。

出席番号 国語 数学 性別
No.1 80 90 男性
No.2 50 70 女性
No.3 100 60 女性
No.4 70 80 女性

 Rでデータフレームを作成するためにはdata.frame()という関数を使います。手順としては最初に各変数をベクトルとして用意しておき、その後にdata.frame()において以下のようにコマンド(記述)するとよいでしょう。注意すべきこととして、ベクトルとして作成された変数名とデータフレームの変数名は違うものにしておくようにしましょう。以下の例ではデータフレームのラベルを全て大文字にしています。

> Jpn <- c(80, 50, 100, 70)
> Mth <- c(90, 70, 60, 80)
> Sex <- c("Male", "Female", "Female", "Male")
> Sex <- factor(Sex, levels=c("Male", "Female"))

> DF <- data.frame(JPN=Jpn, MTH=Mth, SEX=Sex)
> DF
  JPN MTH    SEX
1  80  90   Male
2  50  70 Female
3 100  60 Female
4  70  80   Male

 ここでfactor型の変数が出てきましたので、これについて説明しておきます。factor型とは水準(level)を有した変数のことで、こうした変数のことを統計学ではカテゴリカル型の変数といいます(R上ではinteger型として認識されます)。何の水準も持たない場合、これはcharacter型、つまり文字列のベクトルということになります。

> sex <- c("male", "male", "female", "female")
> typeof(sex)                                     # 型を調べてみるとcharacterである
[1] "character"

> sex <- as.factor(sex)                           # factorとして再定義して、
> typeof(sex)                                     #  型を調べるとintegerになっている。
[1] "integer"

> sex                                             # sexの中身を確認するとfemaleが第1水準である
[1] male   male   female female
Levels: female male

> sex <- factor(sex, levels=c("male", "female"))  # factor()を使ってlevelを指定すると、
> sex                                             #  maleを第1水準とすることもできる。
[1] male   male   female female
Levels: male female

 上記の例でas.factor()を使っていますが、これを使った場合、水準の順番はアルファベット順に自動的に決められてしまいます。つまりfemaleの頭文字はfであり、これはmaleの頭文字であるmよりも前に来るのでfemaleが第1水準とされているわけです。したがって、ユーザーが任意に決めたい場合はfactor()のlevelsという引数を利用しなければなりません。

 ちなみに、一回一回"male"とか"female"と入力するのが面倒な場合は次のようにしてやると簡単です。

> sex <- rep(c(1,2), c(2,2))

> sex
[1] 1 1 2 2

> sex <- factor(sex, levels=c(1,2), labels=c("Male", "Female"))

> sex
[1] Male   Male   Female Female
Levels: Male Female

 ここでrep()という新しい関数が登場していますが、これは第1引数に指定された数値を第2引数に指定された数だけ生成するというものです。

> rep(1, 10)
 [1] 1 1 1 1 1 1 1 1 1 1

> rep(1:3, 3)
[1] 1 2 3 1 2 3 1 2 3

> rep(1:3, c(2,4,6))
 [1] 1 1 2 2 2 2 3 3 3 3 3 3

 さて、このデータフレームは非常に便利な使い方がたくさんできます。例えば女性のデータ行のみを抽出したい場合、国語の点数が80点以上であるデータ行のみを抽出したい場合、あるいは国語が90以上でかつ数学が80以上の女性のデータ行のみを抽出といったことができます。もちろん列のみ、行のみ、特定の値のみにアクセスすることもできます。

 まず先ほど作成したデータフレームであるDFにはどのような変数が含まれているかをnames()という関数を使って確認してみます。

> DF               # データフレームの表示
  JPN MTH    SEX
1  80  90   Male
2  50  70 Female
3 100  60 Female
4  70  80   Male

> names(DF)        # データフレームに含まれる変数を確認
[1] "JPN" "MTH" "SEX"

 特定の列のみを表示させたい場合、行列のように添字番号を指定してもよいですが、名前を指定することでも可能です。

> DF[,2]   # 数学のデータを抽出(列の添字番号で指定)
[1] 90 70 60 80

> DF$MTH   # 数学のデータを抽出(列のラベルで指定)
[1] 90 70 60 80

 さらにこの中(数学データ)から80点以上のデータのみを抽出する場合は次のようにします。

> DF$MTH[DF$MTH >= 80]
[1] 90 80

 その他、いくつか基本的な実行例を示しておきます。

> DF$MTH[DF$MTH >= 80]        # 数学が80点以上のデータ
[1] 90 80

> DF$MTH[DF$SEX == "Female"]  # 女性の数学データ
[1] 70 60

> DF$MTH[DF$SEX == "Female" & DF$MTH >= 80]   # 女性で、数学で80点以上のデータ
numeric(0)                                    #  この場合は該当データがないのでこのように表示される

> DF$MTH[DF$SEX == "Female" & DF$MTH >= 70]   # 女性で"かつ"数学が70点以上であるデータ
[1] 70

> DF$MTH[DF$SEX == "Female" | DF$MTH >= 80]   # 女性"もしくは"数学が80点以上であるデータ
[1] 90 70 60 80

 ここまでは変数単位でのデータを抽出していましたが、行単位で抽出することも可能です。

> DF[DF$SEX == "Male", ]                 # 男性のデータ行のみを抽出
  JPN MTH  SEX
1  80  90 Male
4  70  80 Male

> DF[DF$SEX == "Male" & DF$JPN >= 80, ]  # 男性で"かつ"国語80点以上のデータ行を抽出
  JPN MTH  SEX
1  80  90 Male

> DF[DF$SEX != "Female", ]               # 女性"でない"データ行を抽出
  JPN MTH  SEX
1  80  90 Male
4  70  80 Male

> DF[DF$SEX != "Female", "JPN"]  # 女性"でない"国語の点数だけを表示
[1] 80 70
> DF[DF$SEX != "Female", 1]      # 列番号で指定しても同じようにできる
[1] 80 70

> DF[DF$SEX != "Female", c("JPN", "MTH")]  # 複数列指定することも可能
  JPN MTH
1  80  90
4  70  80
> DF[DF$SEX != "Female", 1:2]              # もちろん列番号でも可能
  JPN MTH
1  80  90
4  70  80