dplyrパッケージは便利ですよね。私もこのパッケージがあるからRを使っているといっても過言ではありません。
さて、今回はそんな便利なdplyrパッケージですが、データフレームを列名でソートする方法を紹介します。
データ自体をソート、並べ替えをするのはarrange関数があるから簡単ですが、列の並び替えをする方法って意外と盲点ではないですか?
今回はそんなお悩みに答えます。
この記事でわかること。
- dplyrパッケージを使って列名の昇順、降順でカラムを並び替えることができる。
では、始めて行きましょう。
Contents
結論(実際のコードの紹介)
今回は非常に簡単なので手短に、コードの紹介をしてちょっとだけ解説をしていきます。
Rにデフォルトで格納されているmpgのデータを使った例になります。
1 2 3 4 5 6 7 8 9 10 11 12 |
#並び替え前 head(mpg) # A tibble: 6 x 11 manufacturer model displ year cyl trans drv cty hwy fl class <chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr> 1 audi a4 1.8 1999 4 auto(l5) f 18 29 p compact 2 audi a4 1.8 1999 4 manual(m5) f 21 29 p compact 3 audi a4 2 2008 4 manual(m6) f 20 31 p compact 4 audi a4 2 2008 4 auto(av) f 21 30 p compact 5 audi a4 2.8 1999 6 auto(l5) f 16 26 p compact 6 audi a4 2.8 1999 6 manual(m5) f 18 26 p compact |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#並び替え後 library(tidyverse) Name_list <- names(mpg) %>% sort() mpg %>% select(all_of(Name_list)) # A tibble: 234 x 11 class cty cyl displ drv fl hwy manufacturer model trans year <chr> <int> <int> <dbl> <chr> <chr> <int> <chr> <chr> <chr> <int> 1 compact 18 4 1.8 f p 29 audi a4 auto(l5) 1999 2 compact 21 4 1.8 f p 29 audi a4 manual(m5) 1999 3 compact 20 4 2 f p 31 audi a4 manual(m6) 2008 4 compact 21 4 2 f p 30 audi a4 auto(av) 2008 5 compact 16 6 2.8 f p 26 audi a4 auto(l5) 1999 6 compact 18 6 2.8 f p 26 audi a4 manual(m5) 1999 7 compact 18 6 3.1 f p 27 audi a4 auto(av) 2008 8 compact 18 4 1.8 4 p 26 audi a4 quattro manual(m5) 1999 9 compact 16 4 1.8 4 p 25 audi a4 quattro auto(l5) 1999 10 compact 20 4 2 4 p 28 audi a4 quattro manual(m6) 2008 |
列名で昇順ソートがされました。
降順に並べ替えたい場合は↓のようにsort関数にdecreasing = Tを指定すると、Name_listが降順に並び変わり残りの手順は昇順と一緒です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Name_list <- names(mpg) %>% sort(decreasing = T ) mpg %>% select(all_of(Name_list)) # A tibble: 234 x 11 year trans model manufacturer hwy fl drv displ cyl cty class <int> <chr> <chr> <chr> <int> <chr> <chr> <dbl> <int> <int> <chr> 1 1999 auto(l5) a4 audi 29 p f 1.8 4 18 compact 2 1999 manual(m5) a4 audi 29 p f 1.8 4 21 compact 3 2008 manual(m6) a4 audi 31 p f 2 4 20 compact 4 2008 auto(av) a4 audi 30 p f 2 4 21 compact 5 1999 auto(l5) a4 audi 26 p f 2.8 6 16 compact 6 1999 manual(m5) a4 audi 26 p f 2.8 6 18 compact 7 2008 auto(av) a4 audi 27 p f 3.1 6 18 compact 8 1999 manual(m5) a4 quattro audi 26 p 4 1.8 4 18 compact 9 1999 auto(l5) a4 quattro audi 25 p 4 1.8 4 16 compact 10 2008 manual(m6) a4 quattro audi 28 p 4 2 4 20 compact |
コードの解説
下のコードでは、mpgのカラム名のベクトルを取得してソートし、Name_listに格納します。
1 |
Name_list <- names(mpg) %>% sort() |
データの中身はこんな感じです。
1 2 3 |
Name_list [1] "class" "cty" "cyl" "displ" "drv" "fl" "hwy" "manufacturer" [9] "model" "trans" "year" |
続いて、下のコードで上でソートした名前のリストの順番に従ってカラムをセレクトします。
1 |
mpg %>% select(all_of(Name_list)) |
select(all_of(××))と記載すると(××はベクトル形式のデータです)××の名前と一致するカラムをselectする動作が行われます。
ただ、注意しなければならないのは、all_of(××)と記載すると××の中にあるものすべてがデータフレームの中に存在しないとエラーになります。
mpgに存在しないカラム名を指定したName_list2をall_ofに指定するとエラーになります。
1 2 3 4 5 |
Name_list2 <- c("class","cty","hoge","hage") mpg %>% select(all_of(Name_list2)) エラー: Can't subset columns that don't exist. x Columns `hoge` and `hage` don't ex ist. |
こんな時はone_ofもしくはany_ofを使いましょう。並べ替えとは関係ないですが・・。
one_of、any_ofは指定した文字列のうち一致する列を選択してくれます。実際の出力を確認するとわかりますが、one_ofの場合、「hoge.hageというカラムはありませんよ」という警告を表示してくれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#any_ofの場合 Name_list2 <- c("class","cty","hoge","hage") mpg %>% select(any_of(Name_list2)) # A tibble: 234 x 2 class cty <chr> <int> 1 compact 18 2 compact 21 3 compact 20 4 compact 21 5 compact 16 6 compact 18 7 compact 18 8 compact 18 9 compact 16 10 compact 20 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#one_ofの場合 Name_list2 <- c("class","cty","hoge","hage") mpg %>% select(one_of(Name_list2)) # A tibble: 234 x 2 class cty <chr> <int> 1 compact 18 2 compact 21 3 compact 20 4 compact 21 5 compact 16 6 compact 18 7 compact 18 8 compact 18 9 compact 16 10 compact 20 # ... with 224 more rows 警告メッセージ: Unknown columns: `hoge`, `hage` |
というわけで、個人的にはall_ofとone_ofを使うことは多いけど、any_ofはほとんど使いませんね。
そもそも、選択したい列の名前ベクトルをきちんと使ってからselect関数に投げたいのでほぼall_ofしか使わないです。
まとめ
data.frameを列名(カラム名)でソートしたい場合は
メモ
- 並べ替えたいdata.frameのカラム名のベクトルを取得
- カラム名のベクトルを並び替える
- 並び替えたベクトルを使ってselect関数でカラムを選択する
といった3つの手順で実現することができました。
また補足として、all_of、one_of、any_ofの使い方は、以下の通りです。
メモ
- all_of:名前のベクトルはデータフレームにすべて存在する必要がある
- one_of/any_of:名前ベクトルに一致した列だけ取得する。存在しない列名がある場合はone_ofは警告を表示する。
それでは。