様々な実験を行って、データはたくさんある。しかしRに読み込んで作図をする段階になってから思うのです。
「このデータ全部使いたい訳じゃなくて、一部、特に特定の実験や試験区だけ抽出してグラフ化したいな」と、そんなときの対処法を今回はまとめています。

材料A〜Eを使用したけど、今回報告書に使うのは材料A〜Cの3種類がだけでいいな。
「材料」列がA, B, Cのみのデータを抽出できれば良いんだけど。

まさか、CSVやそのもとのEXCELのファイルをいじって該当の行以外を消して読み込み用のCSVを再度作ったりしていませんよね?

やってました!だってやり方よく分からないんだもん。
初心者だと結構これやってるよね。
普通に作ったらこうなる
install.packages("ggplot2") #ggplot2のインストール
library(ggplot2) #ggplot2の読み込み
ggplot(iris, aes(x = Species, y = Sepal.Length)) +
geom_boxplot(width = 0.5)+ #箱ひげ図
geom_jitter(aes(colour = Species), alpha = 1, size = 2, width = 0.2)+ #ジッタープロット
xlab("Species")+ylab("Sepal length")+
stat_summary(fun = mean, geom = "point", color = "black", pch = 4, size = 7) + #平均値
theme(text = element_text(size = 24))+
theme(legend.position = "none")#凡例の位置を変更(凡例を消す)

irisからsetosaとvirginiaを抽出してグラフを作成する
filter()関数を使用するには、パッケージdplyrをインストールしてください。
filter()関数を使用することで、データフレームの中から特定の条件を持つ行のみを抽出することができます。
以下に例を示します。データirisからSpecies列が”setosa”の行と”virginica”の行を抽出することができます。
抽出したデータは特に名前を付けて定義せず、さらにパイプ演算子%>%を使用することで、irisから抽出したデータをggplotに送ることができます。
ここで注意したいのは、ggplot()内の第一引数は入れないということです。
データを渡した関数の第一引数には何も入れない。
install.packages("ggplot2") #ggplot2のインストール
install.packages("dplyr") #dplyrのインストール
library(ggplot2) #ggplot2の読み込み
library(dplyr) #dplyrの読み込み
iris %>% dplyr::filter(Species=="setosa"|Species=="virginica") %>%
ggplot(aes(x = Species, y = Sepal.Length)) + #この1行上のコードで抽出したデータについて箱ひげ図を作成(第1引数は空欄になっている)
geom_boxplot(width = 0.5)+ #箱ひげ図
geom_jitter(aes(colour = Species), alpha = 1, size = 2, width = 0.2)+ #ジッタープロット
xlab("Species")+ylab("Sepal length")+
stat_summary(fun = mean, geom = "point", color = "black", pch = 4, size = 7) + #平均値
theme(text = element_text(size = 24))+
theme(legend.position = "none")#凡例の位置を変更(凡例を消す)

【確認方法】本当に抽出できたか心配なとき
filter関数で本当に抽出できたのか、確認しておきたいときがあります。

一応確認したい。というときがありますよね。
そのようなときは、次のような感じで抽出データに名前(この場合”selected_data”)をつけて定義しておくと簡単に確認することができます。
selected_data <- iris %>% dplyr::filter(Species=="setosa"|Species=="virginica") #データirisかsetosaとvirginiicaの行のみ抽出してselected_dataとして保存する
selected_data #selected_dataの中身を確認する
irisからvirginicaとversicolorを抽出してグラフを作成する
今度は、”virginica”と”versicolor”を抽出してみましょう。
install.packages("ggplot2")
install.packages("dplyr")
library(ggplot2)
library(dplyr)
iris %>% dplyr::filter(Species=="virginica"|Species=="versicolor") %>%
ggplot(aes(x = Species, y = Sepal.Length)) +
geom_boxplot(width = 0.5)+
geom_jitter(aes(colour = Species), alpha = 1, size = 2, width = 0.2)+
xlab("Species")+ylab("Sepal length")+
stat_summary(fun = mean, geom = "point", color = "black", pch = 4, size = 7) +
theme(text = element_text(size = 24))+
theme(legend.position = "none")

irisからsetosaのみを抽出してグラフを作成する
もちろん1種類のみを抽出することも可能です。
install.packages("ggplot2")
install.packages("dplyr")
library(ggplot2)
library(dplyr)
iris %>% dplyr::filter(Species=="setosa") %>%
ggplot(aes(x = Species, y = Sepal.Length)) +
geom_boxplot(width = 0.5)+
geom_jitter(aes(colour = Species), alpha = 1, size = 2, width = 0.2)+
xlab("Species")+ylab("Sepal length")+
stat_summary(fun = mean, geom = "point", color = "black", pch = 4, size = 7) +
theme(text = element_text(size = 24))+
theme(legend.position = "none")

一定以上の大きさの数値のフィルタリングなどを組み合わせることも可能
そして、ある数値より大きな数値のデータのみ抽出したり、複数の条件を組み合わせてデター抽出をすることも可能です。
andやorも自由自在にできます。以下、例を示します。
irisからvirginicaとversicolorでかつSepal.Length > 5のデータを抽出して作図しています。
andは “,” で区切り、orは “|” で区切ります。
#irisからvirginicaとversicolorでかつSepal.Length > 5のデータを抽出してグラフ作成
install.packages("ggplot2")
install.packages("dplyr")
library(ggplot2)
library(dplyr)
iris %>% dplyr::filter(Species=="virginica"|Species=="versicolor", Sepal.Length > 5) %>%
ggplot(aes(x = Species, y = Sepal.Length)) +
geom_boxplot(width = 0.5)+
geom_jitter(aes(colour = Species), alpha = 1, size = 2, width = 0.2)+
xlab("Species")+ylab("Sepal length")+
stat_summary(fun = mean, geom = "point", color = "black", pch = 4, size = 7) +
theme(text = element_text(size = 24))+
theme(legend.position = "none")

発表用に仕上げる
発表用に仕上げてみました。個人的な好みで作成しています。
install.packages("ggplot2") #ggplot2のインストール
install.packages("dplyr") #dplyrのインストール
library(ggplot2) #ggplot2の読み込み
library(dplyr) #dplyrの読み込み
theme_set(theme_test())
iris %>% dplyr::filter(Species=="setosa"|Species=="virginica") %>%
ggplot(aes(x = Species, y = Sepal.Length)) + #この1行上のコードで抽出したデータを使用(第1因数は空欄になっている)
geom_boxplot(aes(alpha = 1), width = 0.5, outlier.colour = NA)+ #ヒゲの延長線上にある外れ値を描画しない
geom_jitter(aes(colour = Species), alpha = 0.8, size = 3, width = 0.2)+ #ジッタープロット
xlab("Species")+ylab("Sepal length")+
stat_summary(fun = mean, geom = "point", color = "black", pch = 4, size = 5) +#平均値
theme(legend.position = "none")+#凡例の位置を変更(凡例を消す)
theme(panel.background = element_rect(fill = "white", colour = "black", size = 1))+
theme(axis.ticks.length.x = unit(3, "mm"),
axis.ticks = element_line(color = "black", size = 1))+
theme(axis.ticks.length.y = unit(3, "mm"),
axis.ticks = element_line(color = "black", size = 1)) +
theme(axis.text = element_text(size = 24,colour = "black"))+#x軸y軸のテキストサイズを24に指定
theme(text = element_text(size = 24)) #軸ラベルサイズを24に指定

まとめ
filter関数を使用できるようになると、データ量の多いファイルからの解析や作図が非常に簡単になります。またパイプ演算子を使うと、作図がスムーズになります。
私もまだまだ勉強中ですので、新しく学んだことを記事にして書いていきたいと思います。
読んでいただいた方の参考になればうれしいです。


