生物系のためのR超入門 (5) 【必要なデータの抽出】

#0．はじめに
時には数百行もあるようなデータフレームを扱うことがあります。
しかも、そのうち必要なデータは一部でしかない、というのはよくあることです。
必要なデータだけ取り出せたらとても便利ですよね。
そんな大きなデータを扱うとき以外にも、グループごとに平均値を計算したり、t検定をかけたりするときにも抽出作業が必要になったりします。
今回はデータフレームから必要なデータを取り出す作業をやってみたいと思います。

【前回の記事はこちら】

https://qiita.com/Surku/items/0d91cad3e803b030a4ba

##0-1. 初めて登場する関数・演算子
- `subset(データフレーム名，条件)`
 - データフレームから条件を満たすデータを抽出します。 
- A`&`B
 -  AかつB
- A`|`B
 -  AまたはB

#1. 前回までの復習と前準備
抽出は前回の練習データをちょっとパワーアップさせた練習データを使ってやってみましょう。前回はデータ項目が背丈だけでしたが今回は収量を追加しました。
Excelからのデータの読み込みの復習を兼ねて、よろしければマネして打ち込んで読み込ませてみてください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445663/98cecb82-7a0a-4a9a-e666-1acf8f8cca34.png"width="500">

```R
#ワーキングディレクトリの設定
> setwd("C:/Users/Surku/Desktop/R")
#データの読み込み
> df<-read.table("トウモロコシ.csv",header = TRUE,sep=",")
> df
   ID  Treatment hight yield
1   1 Fertilizer   180   410
2   2 Fertilizer   178   375
3   3 Fertilizer   192   368
4   4 Fertilizer   182   391
5   5 Fertilizer   185   389
6   1    Control   165   352
7   2    Control   171   345
8   3    Control   173   364
9   4    Control   168   378
10  5    Control   169   342
```
このデータについておさらいしますと、トウモロコシを肥料あり区となし区で育て、1区5株、測定項目は背丈と収量という架空実験のデータです。
データフレームには2列目に処理（肥料があるかないか）、3列目に背丈のデータが入っています。
特に2列目の`Treatment`は背丈や収量のデータが`Fertilizer`なのか`Control`なのかのグループを指定する重要な列で、統計用語でいえば**要因**に当たります。
※要因って何だっけ？な人は[第1回へ](https://qiita.com/Surku/items/cec1002d6f6daf5c107c#4-3-factor-%E8%A6%81%E5%9B%A0)

せっかくなので、2列目のデータ型を`factor`にしておきましょう。
これから行う抽出や平均値の計算のためにmustというわけではないのですが、ゆくゆく必要になるのでやっておきます。

流れは、
1．データフレームの2列目だけを取り出し([第3回](https://qiita.com/Surku/items/76abf0c5a58dfd9a3e99#2-3-%E3%83%87%E3%83%BC%E3%82%BF%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%81%AE%E5%88%97%E5%90%8D)で登場)
2．factorに変換し([第1回](https://qiita.com/Surku/items/cec1002d6f6daf5c107c#4-3-factor-%E8%A6%81%E5%9B%A0)で登場)
3．再度データフレームに代入し上書きする
の3段階です。

```R
#2列目だけ取り出す
> df[,2]
 [1] "Fertilizer" "Fertilizer" "Fertilizer" "Fertilizer" "Fertilizer"
 [6] "Control"    "Control"    "Control"    "Control"    "Control"  
#factorに変換 
> as.factor(df[,2])
 [1] Fertilizer Fertilizer Fertilizer Fertilizer Fertilizer Control   
 [7] Control    Control    Control    Control   
Levels: Control Fertilizer
#代入し上書き
> df[,2]<-as.factor(df[,2])
#ほんとにfactorか確認
> class(df[,2])
[1] "factor"
```

#2. `subset()`で抽出
抽出は`subset()`関数を用いて行います。第1引数にデータフレームの変数名を、第2引数に条件を指定すると、条件を満たす行のみ抽出することができます。
第1引数には先ほど読み込んだ`df`を指定します。第2因数にいろいろな条件を入れて試してみましょう。

##2-1. 完全に一致するものを抽出
TreatmentがControlなものだけを抽出してみましょう。
完全に一致することを示す演算子は`==`でした。
※忘れてしまった人は[第2回へ](https://qiita.com/Surku/items/3d67f8ed6baf0ad025c2#0-2%E6%96%B0%E3%81%97%E3%81%8F%E7%99%BB%E5%A0%B4%E3%81%99%E3%82%8B%E6%BC%94%E7%AE%97%E5%AD%90%E8%A8%98%E5%8F%B7)
条件を「dfの2列目がControlと等しい」と指定してあげると、Fertilizerがすべて除外されてControlだけになります。

```R
> subset(df,df[,2]=="Control")
   ID Treatment height yield
6   1   Control   165   352
7   2   Control   171   345
8   3   Control   173   364
9   4   Control   168   378
10  5   Control   169   342
```

##2-2. 大小比較で抽出
数字の大小で抽出することも可能です。例えば3列目のhightが180より大きいことを示すには、「より大きい」を表す`>`を使います。

```R
> subset(df,df[,3]>180)
  ID  Treatment hight yield
3  3 Fertilizer   192   368
4  4 Fertilizer   182   391
5  5 Fertilizer   185   389
```

「以下」を表すためには、イコールを加えた`<=`を用います。次は4列目のyieldが375以下を抽出してみます。

```R
> subset(df,df[,4]<=375)
   ID  Treatment height yield
2   2 Fertilizer   178   375
3   3 Fertilizer   192   368
6   1    Control   165   352
7   2    Control   171   345
8   3    Control   173   364
10  5    Control   169   342
```

##2-3. 複数の条件指定で抽出
単一の条件ではなく、いくつか条件を組み合わせたいときがしばしば生じます。
**かつ**を表すには`&`を、**または**を表すには`|`を用います。
または、の演算子のキーがどこにあるのかわかりにくいのですが、Backspaceキーのとなりにいるので確認してみてください。

```R
#hightが170より大きいかつyieldが350より大きい
> subset(df,df[,3]>170&df[,4]>350)
  ID  Treatment height yield
1  1 Fertilizer   180   410
2  2 Fertilizer   178   375
3  3 Fertilizer   192   368
4  4 Fertilizer   182   391
5  5 Fertilizer   185   389
8  3    Control   173   364

#TreatmentがFertilizerまたはyieldが350より大きい
> subset(df,df[,2]=="Fertilizer"|df[,4]>350)
  ID  Treatment height yield
1  1 Fertilizer   180   410
2  2 Fertilizer   178   375
3  3 Fertilizer   192   368
4  4 Fertilizer   182   391
5  5 Fertilizer   185   389
6  1    Control   165   352
8  3    Control   173   364
9  4    Control   168   378
```
#3. 次回
https://qiita.com/Surku/items/ae16d444d6c22b0dc4e6