R の select 関数: 2 つのデータフレームで共通する列を抽出する

UBC/informatics/r/select_common

このページの最終更新日: 2024/09/30

  1. 2 つのデータフレームで共通する列を抽出する

広告

2 つのデータフレームで共通する列を抽出する

mtcars を例にする。mtcar は以下のようなデータセットで、mpg, cyl... などのデータが列に納められている。

Rの組み込みデータセット mtcars

まず、ここから 2 つのサブデータセットを作ってみよう。mtcars_1 というデータセットには mpg, cyl, disp, hp の列があり、mtcars_2 には mpg, cyl, disp があるようにする。

mtcars1 = select(mtcars, c("mpg, cyl, disp, hp"))
mtcars2 = select(mtcars, c("mpg, cyl, disp"))

mtcars_1 と mtcars_2 に 共通する列を抽出する には、カラムの名前を抽出する colnames 関数 を使って、以下のようにする。

select(mtcars_1, colnames(mtcars_2))

もちろん、データの中身を見て select(mtcars_1, -hp) でも良いのだが、これだと大きなデータセットには対応できない。列名を手打ちせずに、全て関数でやる方法をマスターしておくとよい。


これは、one_of という関数を使ってやることもでき、実はこの方が応用の範囲が広い。こちらで覚えておく方が良さそうだ。

A = colnames(mtcars_2) # 列名を含むベクターを作る
select(mtcars_1, one_of(A)) # ベクターに含まれるものを選ぶ

one_of を入れると、「ベクターのどれかひとつ」が概要すれば select 関数が動くようになる。mtcars_2 ではなく、もとの mtcars を使ってみると違いがわかる。

B = select(mtcars_1, colnames(mtcars))

C = colnames(mtcars)
D = select(mtcars_1, one_of(C))

B は エラーになる。

Error in `select()`:
! Can't subset columns that don't exist.
✖ Columns `drat`, `wt`, `qsec`, `vs`, `am`, etc. don't exist.

drat, wt... などの列が見つからず、select 関数が実行されないので、そもそも B というオブジェクトが生成されない。

一方、C と D のように one_of を使うと、C のベクターのいずれかが mtcars_1 に存在すれば、select 関数は実行される。以下のようなメッセージが出るが、オブジェクト D は生成される。

Warning message:
Unknown columns: `drat`, `wt`, `qsec`, `vs`, `am`, `gear`, `carb`


広告

References

  1. 列の選択 - select関数. Link: Last access 2022/05/24.

コメント欄

サーバー移転のため、コメント欄は一時閉鎖中です。サイドバーから「管理人への質問」へどうぞ。