R (tidyverse), group_by, top_n グループごとの上位を求める

group_by() 関数と top_n() 関数を組み合わせることで、グループごとの上位を求めることができます。

例えば、下記のように同じ Symbol を持つグループのデータがあったとします。

> result_data
# A tibble: 9 x 5
  Id    Symbol Sample1 Sample2 Ratio
  <chr> <chr>    <dbl>   <dbl> <dbl>
1 id1   AAA          1       4  4
2 id2   AAA          2       5  2.5
3 id3   AAA          3       6  2
4 id4   BBB          4       1  0.25
5 id5   BBB          5       2  0.4
6 id6   BBB          6       3  0.5
7 id7   CCC          3       4  1.33
8 id8   CCC          2       5  2.5
9 id9   DDD          1       6  6

この時、各シンボルごとに1番 Ratio の高いデータだけを選ぶには、 group_by(Symbol) として、グループ化したのち、 top_n(1, Ratio) を適応すれば良いです。

実行結果は、下記のようになります。

> result_data %>% group_by(Symbol) %>% top_n(1, Ratio)
# A tibble: 4 x 5
# Groups:   Symbol [4]
  Id    Symbol Sample1 Sample2 Ratio
  <chr> <chr>    <dbl>   <dbl> <dbl>
1 id1   AAA          1       4   4
2 id6   BBB          6       3   0.5
3 id8   CCC          2       5   2.5
4 id9   DDD          1       6   6

 

投稿者:

Atsushi Doi

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