統計プログラムRの勉強日記

Rに関して勉強してきたことを紹介します

【R】パイプ演算子(%>%)の使い方

パイプ演算子タイトル

はじめに

この記事ではパイプ演算子%>%の使い方を図を使いながら説明します。パイプ演算子を使うと処理するごとにいちいち変数を作っていかなくてもよくなり、環境を汚さずに済みます。また後述しますがコードの可読性が上がったりスピーディーにコーディングできたりします。

パイプ演算子とは

パイプ演算子関数と関数を繋げて処理する時に使うものです。一つ前の処理で生成された結果を次の関数に直接渡すことができます。パイプ演算子無しでコードを書く時は一般的に関数を処理するたびに何か適当な名前の変数に代入します。しかし、これだと複雑なな処理をする際、たくさんの変数を作ることになりコードを書くのが大変になったり適当な名前を捻り出すのに苦労したりします。そんな時にパイプ演算子を使って複雑な処理を繋げて一気に終わらせることが出来るのです。

使い方

パイプ演算子%>%magrittrパッケージやdplyrパッケージを呼び出すと使うことができます。
またパイプ演算子は次のように使います。

関数(x) %>%
  関数(y)

パイプ演算子は処理と処理の間を%>%で繋ぎます。この時パイプ演算子の後で呼び出す関数の第一引数が自動的にパイプ演算子の前で処理した結果となるのがポイントです。  

次のコードを見てください。  

library(dplyr)
rnorm(n = 100, mean = 10, sd = 1) %>%  # 平均値10、標準偏差1の正規分布から100個の値をランダムに取得 
  mean() # 上で作った100個の値の平均値算出

ここでは100個の正規分布から生成した値をパイプ演算子を用いて平均値を求める関数に代入しています。

普通に書くと以下のコードになります。

samples = rnorm(n = 100, mean = 10, sd = 1)
mean(samples)

普通に書くと一度samplesに生成した値を代入しておいて、その後その値をまたmeanに入れています。もしsamplesが他に2度と使われないのなら実際は必要の無い変数をいちいち保存していることになります。このようにすると似たような名前の変数が増え、使う変数を間違える危険性があります。そのため、繋がりのある処理をする場合はパイプ演算子を使って簡潔に書く方が良いと考えられます。

ここで実行した処理のイメージは以下の通りです。

動作イメージ

パイプ演算子のイメージは次のとおりです。

パイプ演算子イメージ

なぜパイプ演算子を使うのか

ここからはなぜパイプ演算子がよいのか具体例を挙げながら説明します。
下のコードをみてください。

set.seed(1)
pull(arrange(filter(mutate(data.frame(A = 1:10), B = sample(A, 10)), B < 5), B), A)

出力される結果はこんな感じになります。(クリックで表示) [1] 4 5 7 2

このコードでは複数の処理を一度におこなっています。これを見ても何を行っているのかが非常にわかりにくいと思います。
上のコードをパイプ演算子を使って表現すると次のようになります。

set.seed(1)
data.frame(A = 1:10) %>% # 1から10までの値をA列として持つデータフレームを作り、
  mutate(B = sample(A, 10)) %>%  # A列からランダムな順番で取り出しB列とする。
  filter(B < 5) %>% # そのB列に対して値が5より小さいかどうかでフィルターする。
  arrange(B) %>%  # フィルターして残った値を昇順に並べ替えて、
  pull(A) # 隣のA列をベクトルとして取り出す。

出力される結果はこんな感じになります。(クリックで表示) [1] 4 5 7 2

見ていただけばわかるとは思いますが、このように複数の関数を繋げて処理する場合はパイプ演算子を使ったほうがコードを見直した時にわかりやすくなります

まとめ

 今回はパイプ演算子について紹介しました。使いこなせるとコードの可読性が向上しますしスピーディーにコードが書けるようになると思います。 ぜひ使ってみて下さい。