【Rとggplot2】データから条件に合うものを抽出して作図する

dplyrで条件に合うデータを抽出する Rとggplot2
スポンサーリンク

様々な実験を行って、データはたくさんある。しかし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")#凡例の位置を変更(凡例を消す)
ggplot2で作成した箱ひげ図

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関数で抽出して作図

【確認方法】本当に抽出できたか心配なとき

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")
filter関数で抽出して作図

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")
irisからsetosaを抽出してグラフ作成

一定以上の大きさの数値のフィルタリングなどを組み合わせることも可能

そして、ある数値より大きな数値のデータのみ抽出したり、複数の条件を組み合わせてデター抽出をすることも可能です。

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")
filter関数で抽出して作図

発表用に仕上げる

発表用に仕上げてみました。個人的な好みで作成しています。

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関数を使用できるようになると、データ量の多いファイルからの解析や作図が非常に簡単になります。またパイプ演算子を使うと、作図がスムーズになります。

私もまだまだ勉強中ですので、新しく学んだことを記事にして書いていきたいと思います。

読んでいただいた方の参考になればうれしいです。

この記事を書いた人
あをみどり

30代技術職(研究開発)です。週末は子どもと出かけた先で写真撮影をしています。このブログでは機材のレビューやお出かけの記録を配信しています。
最近は家庭菜園にも凝っています。そのほか、Rやggplotなどについて備忘録的に色々書こうと思っています。

あをみどりをフォローする
Rとggplot2
スポンサーリンク
シェアする
blue green photography
タイトルとURLをコピーしました