
【1-16】Rでベクトルから条件に合ったデータを抽出する
第1章ではRの基本的な操作について紹介しています。
Rではデータフレームを作ると以下のような形になっています。

「身長」の列には男性も女性も含まれています。このとき男性だけのデータ、女性だけのデータを取り出したいときもあります。今回は特定の条件にあう要素を抜き出す方法を紹介します。
データの準備
以下のコードを全てコピー
→Rstudioのスクリプト画面に貼り付け
→全て選択してRun(cntrもしくはcommand + Enter)
url <- "https://raw.githubusercontent.com/mitti1210/myblog/master/data01.csv"
data <- read.csv(url)
#data01の列に”group”というデータを追加する
set.seed(1)
data[["group"]] <- sample(x=c("a","b","c"), size=200, replace=TRUE)
[ ]を使う
特定の条件にあう要素を抜き出すには[ ]を使います。
【1-11】Rで必要なベクトルとdata.frameについてでは[[ ]]が出てきましたが、[[]]はdata.frameから特定の列を抽出する場合です。今回は[[ ]]ではなく[ ]です。
男性の氏名を抜き出すのは下のコードになります。
データフレーム$表示したい列[条件]
data$氏名[data$性別 == "男性"]
data$氏名[data$性別 != "女性"] #上と同じデータになるはず

条件式について

ここで新たな == が出てきました。条件に関しては基本的には上の条件式を使います。条件式を使うことで論理型になります。
data$性別 == "男性"

[ ]の中はTRUE/FALSEの論理型ということになる
data$氏名は200個の名前が並んでいますが、[ ] のTRUEに当たるものだけを抽出していることになります。
data$年齢[data$性別 == "男性"]
data$年齢[data$性別 != "女性"] #上と同じデータになるはず
A == Bと A %in% Bは似ていますが、Bにあたる部分で==であれば1つしか入りません。%in%は1つでも複数でも大丈夫です。その際はdata$氏名[data$性別 %in% c("男性","女性")]のようにc関数を使います。
data$身長[data$group %in% c("a","b")]
data$身長[!data$group %in% !c("a","b")] #これはエラーになる
data$身長[!data$group %in% c("a","b")] #!をつけるときは最初につける
data$身長[data$group %in% "c"] #上と同じデータになるはず
複数条件
条件は複数でも可能です。
&や|を使い分けて条件式を作ります。見づらい場合は()で挟むのも一つの手です。
data$氏名[data$group == "a" & data$年齢 > 60] #&や|を使い組み合わせることが可能
data$氏名[(data$group == "a") & (data$年齢 > 60)] #同じ結果
条件式をindexとして使う
他にも条件式を変数に入れる方法もあります。
例えばindexなどの変数名に条件を入れると、実際のデータの抽出では[index]と書くだけでいいです。さらに条件を変えてもindex <- …の所だけを修正すればよくなるのでエラーも減りやすいです。
data$group == "a" & data01$年齢 > 60
index <- data$group == "a" & data$年齢 > 60 #条件式を変数にしてしまう
data01$氏名[index] #するとコードがわかりやすい
条件式と集計の組み合わせ
条件を組み合わせて抽出できれ平均や標準偏差も計算できます。
data$年齢[data$性別 == "男性"]
mean(data$年齢[data$性別 == "男性"])
sd(data$年齢[data$性別 == "男性"])

まとめ
今回はベクトルでのデータ抽出を行いました。data.frameで条件に合った行を抜き出すといったことは第2章で行う予定ですが、[ ]は最初慣れないのでわからなくなったらこのページに戻って復習してみてください。