(旧ページ) R データフレームからの抽出:
列指定、行指定とその両方

UB3/informatics/r/dataframe_extract_blood

このページの最終更新日: 2023/10/28


このページでは、自作のデータセットを使って列、行の抽出をまとめてある。2022 年 12 月に 新しいページ を組み込みデータセットを使って更新したので、今後はそちらを参照のこと。

このページもネット上に残してあるが、更新は 2022 年 12 月でストップしている。


  1. 概要: このページで扱うデータフレーム
  2. データフレームから特定の列を抽出する
  3. データフレームから特定の行を抽出する
    • 行番号を指定して行を抽出
    • 文字列を指定して行を抽出
    • ある数字より大きい・小さい行を抽出
    • filter 関数を使用する
  4. データフレームから特定の列・行を除く
  5. さまざまな条件指定のパターン
    • 行番号と列番号の両方で指定する

広告

概要: このページで扱うデータフレーム

このページでは、以下の整然データのデータフレームから、特定の行または列を抽出する方法をまとめる。整然データについては、データフレームの概要と作成 のページを参照のこと。

行を取り出す場合は、それぞれのサンプルを抽出することになる。したがって、値の代償で指定する場合などは、行単位で抽出することになるケースが多いだろう。

列を取り出す場合は、特定のパラメーターについて、全てのサンプルのデータを抽出するという意味合いになる。


Blood_type Body_weight
1 A 65
2 A 59
3 B 45


データフレームから特定の列を抽出する

データラベルで指定する

基本的には、データラベルを使った取り出しを推奨する。この場合はドル記号を使う。以下のような データフレーム A を考える。

Blood_type Body_weight
1 A 65
2 A 59
3 B 45

一列目の Blood_type および Body_weight が列ラベルであるので、以下のように Blood_type を指定することで、1 列目のみを取り出し、オブジェクト B として保存することができる。

B = A$Blood_type


列番号で指定する

データフレーム A から 2 列目だけを抜き出すときは、[ ] と列番号を使って

A[2]

とする。しかし、リストから列番号を使って取り出すと、リストとして取り出されてしまう。数値のみのデータ列を取り出した場合でもそうなる。そのまま関数に入れることができないので、これはかなり不便。実例を見てみよう。

A[2]
Body_weight
1 65
2 59
3 45

このようなときは、列番号の前にコンマを入れるとベクトルとして取り出せる。なお、is.vector(B) とすると、B がベクトルなら TRUE、そうでないなら FALSE という結果が返ってくる。

A[,2]
[1] 65 59 45

あるいは [ ] を二重にしても OK。この二重かぎカッコ [[ ]] は、$ とは微妙に動作が異なる。[[ ]] では式が展開されるが、$では展開されないようである。

A[[2]]
[1] 65 59 45


select 関数を使用する

連続しない複数列を抽出したい場合は、select 関数が便利である。ライブラリー dplyr を使う必要がある。インストールされていないならまず install.packages でインストールし、読み込んでから使う。.data でデータフレームを指定し、その後に列番号を書く。syntax が直感的で覚えやすいのがいい。

詳細は select 関数 のページにまとめた。

install.packages('dplyr') # 初回のみ
library(dplyr)
A = select(.data = dataframe, 1,3)

既存のデータフレームから列を除くときも、マイナス記号を使える。複数の列を一気に除きたいときは、c でくくる。

A = select(.data = A, -列名)
A = select(.data = A, -c(列名1、列名2...))


データフレームから特定の行を抽出する

行番号を指定して行を抽出

Blood_type Body_weight
1 A 65
2 A 59
3 B 45

このようなデータフレーム A から 2 行目だけを抜き出すときは、

A[2,]

  Blood_type Body_weight
2       A       59

2 行目から 3 行目までを抜き出すときは

A[2:3,]

  Blood_type Body_weight
2       A       59
3       B       45


文字列を指定して行を抽出

ラベル指定、イコールには == を使い、行指定なので , が入るという 3 つがポイント。

> A

Blood_type Body_weight
1 A 65
2 A 59
3 B 45

A[A$Blood_type=="B",]


Blood_type Body_weight
3 B 45

単に A$Blood_type=="B" とすると、[1] FALSE FALSE TRUE という答えが帰ってくる。


ある数字より大きい・小さい行を抽出

文字列一致と似ている。まずラベルを指定し、大小は < または > で指定。最後に , をつける。似たような内容が R: 数値の大小でカットオフまたは 0/1 に変換する のページにもあるので、そちらも参照のこと。

> A

Blood_type Body_weight
1 A 65
2 A 59
3 B 45

A[A$Body_weight<50,]


Blood_type Body_weight
3 B 45

filter 関数を使用する

R では、行ラベルは $ のような簡単な指定方法がないので、列ラベルに比べて扱いが難しい。多くの 組み込みデータセット がそうであるように、基本的には取り出したい項目を列に収めるのがよい。

filter 関数は、指定した条件に従って特定の行を取り出す関数である。詳細は filter 関数のページ にまとめてあるので、ここでは基本的な使い方のみを示す。

まず .data でデータセットを指定する。その次には論理式がくる。%in% は「等しい」という演算子で、filter 関数と共によく使われる。Blood_type %in% c("A") で血液型が A である列のみを取り出せることになる。

filter(.data = A, Blood_type %in% c("A"))

Blood_type Body_weight
1       A       65
2       A       59

もっと単純に、

filter(A, Blood_type == "A")

でも同じ結果になる。


データフレームから特定の列・行を除く

R デフォルトの関数を使う場合、削除するというよりも、除きたいもの以外を別オブジェクトに保存する と考えるのがよい (4)。したがって、上記のリンクから「データフレームの抽出」を参照のこと。

たとえば、全体で 8 列のデータセットで、1 列目を除きたい場合はこうなる。

A2 = A[2:8]

列を選択する select 関数、行を選択する filter 関数 を使う方法もある。基本的な用例を載せておく。詳細は各関数のページを参照のこと。

A = select(data, -列名)
A = select(data, -列名1, -列名2) #複数を除くときはコンマで繋げられる


さまざまな条件指定のパターン

行番号と列番号の両方で指定する

> A

Blood_type Body_weight
1 A 65
2 A 59
3 B 45

A[1,2] #行、列の順に指定

[1] 65


広告

References

  1. Rの data frame から行や列を選択して取り出す. Link.
  2. Rでデータフレームからデータを抽出 (検索). Link: Last access 2019/10/24.

コメント欄

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