====== R の基本2(データフレーム) ======
ここではデータフレームの扱い方について説明する。
===== データフレームの形式 =====
データフレームの形式は以下のようなものである。
^ ^ ラベル1 ^ ラベル2 ^ … ^
^ ID1 | 要素1-1 | 要素1-2 | … |
^ ID2 | 要素2-1 | 要素2-2 | … |
^ … | … | … | … |
要素の参照方法は後述するが、要素は行・列・ラベルのいずれかで指定する。
===== 既存のデータセット =====
R にはあらかじめデータセットがいくつか用意されており、その中にはデータフレームが多くある。
例えば、airquality は 1973 年にニューヨークで観測されたオゾン濃度((オゾンは酸素原子が3つ結合した分子である。大気中のオゾン濃度が高い層はオゾン層と呼ばれ、太陽光の紫外線を吸収する効果がある。))などの時系列データである。
^ 列 ^ ラベル ^ 説明 ^
| 1 | Ozone | 平均オゾン濃度 [ppb] (ルーズベルト島、13時から15時) |
| 2 | Solar.R | 太陽放射エネルギー密度 [ly] (セントラルパーク、8時から12時) |
| 3 | Wind | 平均風速 [mph] (ラガーディア空港、7時から10時) |
| 4 | Temp | 日最高温度 [°F] (ラガーディア空港) |
| 5 | Month | 観測した月 |
| 6 | Day | 観測した日 |
単位は主にアメリカで使われている単位である。
^ 単位 ^ 意味 ^
| ppb | parts per billion の略で、十億分率のこと。大気中の分子10億個中にあるオゾンの個数を表す。 |
| ly | ラングレーといい、1平方センチメートルに1分間に到達する放射量をカロリーで表した単位である。 |
| mph | miles per hour の略で、マイル毎時という。1マイルは 1.609344 kmである。 |
| °F | 華氏(ファーレンハイト)温度の単位である。華氏温度 $F$ から摂氏(セルシウス)温度へは $\frac{5}{9}(F-32)$ で変換される。 |
airquality を変数 df に代入して使用する場合はコンソールに次のように入力する。
> df <- airquality
コンソールに単純に df と入力すると内容が表示される。
> df
ただし、大きいデータだとコンソールでは見にくいので、 RStudio では右上のペインの Environment にリストされる変数 df をクリックすると左上のペインに df の内容が表示される。
以下ではこの df を使って例を示す。
===== データフレームの情報 =====
データフレームの情報を表示するための関数には以下のようなものがある。
^ 関数 ^ 機能 ^
| ''dim(データフレーム)'' | データフレームの次元を返す。 |
| ''nrow(データフレーム)'' | データフレームの行数を返す。 |
| ''ncol(データフレーム)'' | データフレームの列数を返す。 |
| ''colnames(データフレーム)'' | データフレームの列のラベルをベクトルで返す。 |
| ''rownames(データフレーム)'' | データフレームの行のラベルをベクトルで返す。 |
| ''str(データフレーム)'' | データフレームの構造を表示する。 |
''dim()'' では行数と列数が一度に表示される。
> dim(df)
[1] 153 6
df は 153 行 6 列のデータであることが分かる(ラベルはカウントしない)。
''str()'' では少し詳しい情報が表示される。
> str(df)
'data.frame': 153 obs. of 6 variables:
$ Ozone : int 41 36 12 18 NA 28 23 19 8 NA ...
$ Solar.R: int 190 118 149 313 NA NA 299 99 19 194 ...
$ Wind : num 7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
$ Temp : int 67 72 74 62 56 66 65 59 61 69 ...
$ Month : int 5 5 5 5 5 5 5 5 5 5 ...
$ Day : int 1 2 3 4 5 6 7 8 9 10 ...
===== 要素の参照 =====
==== 単純参照 ====
要素番号を指定して個別の要素を取り出すには、角かっこで ''[行番号,列番号]'' のように要素番号を指定する。
=== 例)5行3列目の要素の参照 ===
> df[5, 3]
----
==== 名前付き参照 ====
各項目に付けられたラベルで要素を取り出すには、要素番号の代わりにラベルを指定する。
変数の後ろに ''$ラベル'' を付けてもよい。
=== 例)5行3列目の要素の参照 ===
> df[5, "Wind"]
> df$Wind[5]
----
==== 行の集合参照 ====
行番号(の範囲)を指定すると、その範囲の要素をまとめて取り出せる。
=== 例)5行目の要素の参照 ===
> df[5,]
=== 例)3,10行目の参照 ===
> df[c(3, 10),]
=== 例)3〜6行目の参照 ===
> df[3:6,]
----
==== 列の集合参照 ====
列番号(の範囲)を指定すると、その範囲の要素をまとめて取り出せる。
列の集合参照には何通りか方法があるが、戻り値が少し異なる。
変数がデータフレーム、tibble型、行列の場合をまとめて挙げる。
^ 形式 ^ 変数がデータフレームの戻り値 ^ 変数が tibble 型の戻り値 ^ 変数が行列の戻り値 ^
| ''変数[列番号]'' | 列の要素(データフレーム) | 列の要素(tibble 型) | 行列を1次元配列とした要素 |
| ''変数%%["ラベル"]%%'' | 列の要素(データフレーム) | 列の要素(tibble 型) | |
| ''変数[,列番号]'' | 列の要素(ベクトル) | 列の要素(tibble 型) | 列の要素(ベクトル) |
| ''変数%%[,"ラベル"]%%'' | 列の要素(ベクトル) | 列の要素(tibble 型) | |
| ''変数%%[[列番号]]%%'' | 列の要素(ベクトル) | 列の要素(ベクトル) | 行列を1次元配列とした要素 |
| ''変数%%[["ラベル"]]%%'' | 列の要素(ベクトル) | 列の要素(ベクトル) | |
| ''変数$ラベル'' | 列の要素(ベクトル) | 列の要素(ベクトル) | |
=== 例)3列目の要素の参照 ===
ベクトルとしての参照
> df[, 3]
> df[, "Wind"]
> df$Wind
データフレームとしての参照
> df["Wind"]
> df[3]
=== 例)1,3,5列目の要素の参照 ===
> df[, c(1, 3, 5)]
> df[c(1, 3, 5)]
=== 例)2〜4列目の参照 ===
> df[, 2:4]
> df[2:4]
----
==== 除外参照 ====
頭に ''-'' をつけて要素を指定すると、その要素以外の要素を取り出すことができる。
これを利用すれば、データフレームから任意の行や列を削除できる。
=== 例)3列目以外の参照 ===
> df[, -3]
> df[-3]
=== 例)2,4列目以外の参照 ===
> df[, -c(2, 4)]
> df[-c(2, 4)]
=== 例)10〜19行目以外の参照 ===
> df[-(10:19),]
----
==== 条件付き参照 ====
条件式で条件を満たす要素だけを取り出すことができる。
=== 例)平均風速が10mph以上の行の参照 ===
> df[df$Wind >= 10,]
この意味は、''df$Wind >= 10'' だけを実行してみると分かる。
=== 例)平均オゾン濃度が100ppb以上の行の参照 ===
> df[!is.na(df$Ozone) & df$Ozone >= 100,]
''is.na(値)'' は、値が ''NA'' の場合は ''TRUE''、それ以外では ''FALSE'' を返す。
Ozone の列には ''NA'' が含まれているので、''!is.na(df$Ozone)'' を使って ''NA'' を含む行を ''FALSE'' にしている。
=== 例)平均オゾン濃度が100ppb以上または平均風速が10mph以上の行の参照 ===
> df[(!is.na(df$Ozone) & df$Ozone >= 100) | df$Wind >= 10,]
----
==== ソート ====
=== 例)平均風速の小さい順にソート ===
> df[order(df$Wind),]
=== 例)平均風速の大きい順にソート ===
> df[order(-df$Wind),]
=== 例)平均風速の小さい順にソートし、平均風速が同じ場合は平均オゾン濃度の小さい順にソート ===
> df[order(df$Wind, df$Ozone),]
===== 要素の追加 =====
==== 列の追加 ====
データフレームに列を追加するには ''cbind()'' を使う。
=== 例)平均風速をkm毎時に変換して列を追加 ===
> df2 <- cbind(df, 風速 = df$Wind * 1.609344)
「風速」というラベルの列が最後の列に追加されて変数 df2 に代入される。
----
==== 行の追加 ====
データフレームに行を追加するには ''rbind()'' を使う。
=== 例)1,2,3,4,5,6 という値を持つ行を追加 ===
> df3 <- rbind(df, c(1, 2, 3, 4, 5, 6))
新しい行が最後の行に追加されて変数 df3 に代入される。
===== 要素の削除 =====
==== 列の削除 ====
データフレームから列を削除するには、対象の列に ''NULL'' を代入すると簡単にできる。
=== 例)df2 から「風速」のラベルの列を削除 ===
> df2$風速 <- NULL
----
==== 行の削除 ====
データフレームから行を削除するには、対象の行を除外参照して代入する。
=== 例)df3 から 154行目を削除 ===
> df3 <- df3[-154,]