R言語でデータフレームの行を並び替える方法について解説します。行を並び替えのことを一般的にソートと言います。このような方法はいくつかあり、R言語に標準で搭載されている機能を使用した方法もありますが、ここではtidyverseパッケージに含まれているdplyrパッケージのarrange()を使用した方法についてお伝えします。arrange()を使用する利点は、パイプ演算子と親和性が高くR言語に標準で搭載されている機能を使用する方法よりも可読性が高いコードが書けることが挙げられます。

arrange()の概要

arrange()は、データフレームの行を並び替えるための関数です。arrange()は他のdplyr関数とは異なり、arrange()はグループ化をほとんど無視します。変数をグループ化するには、変数のグループ化を明示的に言及する(または.by_group = TRUEを使用する)必要があり、変数の関数はグループごとに1回ではなく、データフレームごとに1回評価されます。

arrange()の使い方

dplyr::arrange()の使い方は次になります。


arrange(.data, ..., .by_group = FALSE)

## S3 method for class 'data.frame'
arrange(.data, ..., .by_group = FALSE, .locale = NULL)

relocate()の引数の意味

.data

データフレームまたはデータフレーム拡張(例:tibble)、遅延データフレーム(例:dbplyrまたはdtplyrから)を指定します。

列名または列名の関数を指定します。
desc()を使用して、変数を降順でソートします。

.by_group = FALSE

TRUEの場合、最初にグループ化変数で並べ替えられます。グループ化されたデータフレームにのみ適用されます。

.locale = NULL

文字ベクトルを並べ替えるロケールを指定します。

  • [デフォルト]NULL: dplyr.legacy_localeグローバル・オプションのエスケープ・ハッチがアクティブでない限り、”C”ロケールが使用されます。詳細については、dplyr-locale ヘルプページを参照してください。
  • stringi::stri_locale_list()からの単一の文字列が指定されている場合: ソートするロケールとして使用されます。たとえば、”en”はアメリカ英語のロケールで並べ替えられます。これには stringiパッケージが必要です。
  • “C” が指定されている場合: 文字ベクトルは常にCロケールでソートされます。これはstringiを必要とせず、多くの場合、ロケール識別子を指定するよりもはるかに高速です。

Cロケールは、特に大文字と小文字が混在するデータに関しては、”en” などの英語ロケールとは異なります。これについては、ロケールヘルプページの「デフォルトロケール」セクションで詳しく説明しています。

準備

あらかじめ、tidyverseパッケージを読み込んでおきます。


library(tidyverse)

解説のために、次のirisデータセットを使用します。


iris |>
  head()

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

昇順で行を並び替え

irisデータセットで、列Sepal.Lengthの値から行を昇順で並び替えるには次のようにします。


iris |>
  arrange(Sepal.Length) |>
  head()

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          4.3         3.0          1.1         0.1  setosa
2          4.4         2.9          1.4         0.2  setosa
3          4.4         3.0          1.3         0.2  setosa
4          4.4         3.2          1.3         0.2  setosa
5          4.5         2.3          1.3         0.3  setosa
6          4.6         3.1          1.5         0.2  setosa

降順で行を並び替え

irisデータセットで、列Sepal.Lengthの値から行を降順で並び替えるには次のようにします。


iris |>
  arrange(desc(Sepal.Length)) |>
  head()

  Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
1          7.9         3.8          6.4         2.0 virginica
2          7.7         3.8          6.7         2.2 virginica
3          7.7         2.6          6.9         2.3 virginica
4          7.7         2.8          6.7         2.0 virginica
5          7.7         3.0          6.1         2.3 virginica
6          7.6         3.0          6.6         2.1 virginica

昇順と降順を含む並び替え

irisデータセットで、列Sepal.Lengthを昇順で、列Petal.Lengthを降順で並び替えるには次のようにします。


iris |>
  arrange(Sepal.Length, desc(Sepal.Length)) |>
  head()

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          4.3         3.0          1.1         0.1  setosa
2          4.4         2.9          1.4         0.2  setosa
3          4.4         3.0          1.3         0.2  setosa
4          4.4         3.2          1.3         0.2  setosa
5          4.5         2.3          1.3         0.3  setosa
6          4.6         3.1          1.5         0.2  setosa
R入門 データフレームの行を並び替える方法