R (tidyverse), %>% パイプ

select 関数の記事でも少し触れましたが、 tidyverse パッケージを用いた R では、シェルスクリプトのようなパイプの処理が可能です。具体的には、 %>% という演算子を用います。

オブジェクト %>% 関数(引数2)

演算子の左側に書かれたオブジェクトが、演算子の右側の関数の引数に用いられます。例えば、次のような表現が可能です。

result_data %>% select(Symbol, Sample1)

上記では、result_data を select() 関数の最初の引数として渡しています。つまり、下記の表現と同義です。

select(result_data, Symbol, Smple1)

パイプ %>% を使った表現の何がメリットかというと、処理結果を連続して渡せることです。よって、下記のような表現が可能です。

result_data %>% select(Symbol, Sample1) %>% filter(Sample1 > 1)

これで、select関数で列を選択したのち、filter関数で行を選択するという作業を続けて書けます。途中で改行を挟んでも良いので、コードも読みやすくなります。

result_data <- input_data %>%
  inner_join(meta_data)   %>%
  select(Symbol, Sample1) %>%
  filter(Sample > 1)

上記のように続けて書くと、「inner_join で結合したのち、select で列を選択し、filter で行を選択した結果が result_data に入る」という意味になります。

もし、パイプを使わなかったら、下記のような表現になるでしょう。

result_data <- inner_join(result_data, meta_data)
result_data <- select(result_data, Symbol, Sample1)
result_data <- filter(result_data, Sample > 1)

# もしくは、無理やり1行で、、、
result_data <- filter(select(inner_join(input_data, meta_data), Symbol, Sample1), Sample1 > 1)

同じ変数に代入し続けたり、ネストを深くする書き方は、避けたほうが無難です。後でコードを見返したときに分かりにくくなるためです。コーディングのミスや、デバッグ時の手間の増加につながります。

 

投稿者:

Atsushi Doi

株式会社セルイノベーター、主任研究員。理学博士。山口大学大学院理工学研究科修了。東京大学医科学研究所ヒトゲノム解析センターの特任助手を経て、株式会社GNIに主任研究員として勤務。その後、株式会社セルイノベーターの立ち上げに参加し、現在に至る。専門は、バイオインフォマティクス、おもにシステムバイオロジー。