【R】データの列や行を並び替える方法(select&everything、arrange)

こんてんつ

Rにおいて、データフレームの列や行を並び替える方法について紹介します。tidyverseパッケージ集の中のdplyrパッケージのselect関数、arange関数を利用します。

  • 列:任意の並び替え&昇順降順ソート
  • 行:昇順降順ソート

関連記事

contents-open.hatenablog.com

早見チートシート

パッケージのインストール&読み込み

install.packages("tidyverse")
library(tidyverse)

列の並び替え

# 任意の順番を指定する

iris_column_ordered <- iris %>% select(Petal.Width, everything())

iris_column_ordered <- iris %>% select(Petal.Length, Species, everything())

iris_column_ordered <- iris %>% select(starts_with("Petal"), everything())

# 列の名前順のcolumn_orderを作ってソートする

column_order <- names(iris) %>% sort()
iris_column_ordered <- iris %>% select(all_of(column_order))

column_order <- names(iris) %>% sort(decreasing = T)
iris_column_ordered <- iris %>% select(all_of(column_order))

行の並び替え

# 指定した列で昇順or降順ソート

iris_row_orderd <- iris %>% arrange(Sepal.Length)

iris_row_orderd <- iris %>% arrange(desc(Sepal.Length)) #文字列に対応可

iris_row_orderd <- iris %>% arrange(-Sepal.Length) #文字列に対応不可

iris_row_orderd <- iris %>% arrange(Sepal.Length, Petal.Length)

詳細

列の任意並び替え

select関数によって、Petal.Widthを左端に持ってきて、その他の行を右に繋げている。

iris_column_ordered <- iris %>% select(Petal.Width, everything())
head(iris_column_ordered)
> head(iris_column_ordered)
  Petal.Width Sepal.Length Sepal.Width Petal.Length Species
1         0.2          5.1         3.5          1.4  setosa
2         0.2          4.9         3.0          1.4  setosa
3         0.2          4.7         3.2          1.3  setosa
4         0.2          4.6         3.1          1.5  setosa
5         0.2          5.0         3.6          1.4  setosa
6         0.4          5.4         3.9          1.7  setosa
> 

複数の行がある場合は、次のようにつなげる。

iris_column_ordered <- iris %>% select(Petal.Length, Species, everything())
head(iris_column_ordered)
> head(iris_column_ordered)
  Petal.Length Species Sepal.Length Sepal.Width Petal.Width
1          1.4  setosa          5.1         3.5         0.2
2          1.4  setosa          4.9         3.0         0.2
3          1.3  setosa          4.7         3.2         0.2
4          1.5  setosa          4.6         3.1         0.2
5          1.4  setosa          5.0         3.6         0.2
6          1.7  setosa          5.4         3.9         0.4

selectの中で利用する便利な関数を使って、指定した条件に合致するものを左に持ってくることも可能。

iris_column_ordered <- iris %>% select(starts_with("Petal"), everything())
head(iris_column_ordered)
> head(iris_column_ordered)
  Petal.Length Petal.Width Sepal.Length Sepal.Width Species
1          1.4         0.2          5.1         3.5  setosa
2          1.4         0.2          4.9         3.0  setosa
3          1.3         0.2          4.7         3.2  setosa
4          1.5         0.2          4.6         3.1  setosa
5          1.4         0.2          5.0         3.6  setosa
6          1.7         0.4          5.4         3.9  setosa

selectの使い方はこちら。

contents-open.hatenablog.com

列の昇順降順ソートによる並び替え

列の名前でソートしたい場合は、ソートされた列名のベクトルを用意すればよい。下に示す例の場合は、列名からcolumn_orderというベクトルを用意して、昇順ソートした。その後、select関数の中で、all_of関数を使って並べ替えている。

column_order <- names(iris) %>% sort()
iris_column_ordered <- iris %>% select(all_of(column_order))
head(iris_column_ordered)
> head(iris_column_ordered)
  Petal.Length Petal.Width Sepal.Length Sepal.Width Species
1          1.4         0.2          5.1         3.5  setosa
2          1.4         0.2          4.9         3.0  setosa
3          1.3         0.2          4.7         3.2  setosa
4          1.5         0.2          4.6         3.1  setosa
5          1.4         0.2          5.0         3.6  setosa
6          1.7         0.4          5.4         3.9  setosa

降順にしたければ、次のようにすればよい。

column_order <- names(iris) %>% sort(decreasing = T)
iris_column_ordered <- iris %>% select(all_of(column_order))
head(iris_column_ordered)
> head(iris_column_ordered)
  Species Sepal.Width Sepal.Length Petal.Width Petal.Length
1  setosa         3.5          5.1         0.2          1.4
2  setosa         3.0          4.9         0.2          1.4
3  setosa         3.2          4.7         0.2          1.3
4  setosa         3.1          4.6         0.2          1.5
5  setosa         3.6          5.0         0.2          1.4
6  setosa         3.9          5.4         0.4          1.7

行の昇順降順ソート

特定の列名でソートする場合は、次のようにすれば良い。

iris_row_orderd <- iris %>% arrange(Sepal.Length)
head(iris_row_orderd)
> head(iris_row_orderd)
  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_row_orderd <- iris %>% arrange(desc(Sepal.Length)) #文字列に対応可
head(iris_row_orderd)

iris_row_orderd <- iris %>% arrange(-Sepal.Length) #文字列に対応不可
head(iris_row_orderd)
> head(iris_row_orderd)
  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_row_orderd <- iris %>% arrange(Sepal.Length, Petal.Length)
head(iris_row_orderd)
> head(iris_row_orderd)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          4.3         3.0          1.1         0.1  setosa
2          4.4         3.0          1.3         0.2  setosa
3          4.4         3.2          1.3         0.2  setosa
4          4.4         2.9          1.4         0.2  setosa
5          4.5         2.3          1.3         0.3  setosa
6          4.6         3.6          1.0         0.2  setosa