R データフレームの取り扱い:
作成、抽出、削除、合成など

informatics/r/dataframe
2018/12/09 更新

  1. 概要: データフレームとは
  2. データフレームを作成する
    • 手入力で作成
    • Excel からコピペする
    • csv ファイルを読み込む
  3. データフレームから特定の列・行を抽出する
  4. データフレームから特定の列・行を除く
  5. 2 つのデータフレームを合成する
  6. データフレームをベクトルに変換する

広告

概要: データフレームとは

データフレームとは、R で取り扱う数値を格納した表のような概念である。ExcelMySQL 、MATLAB などに馴染みがあればわかりやすいだろう。例えばこのようなデータである。

> A

Blood_type Body_weight
1 A 65
2 A 59
3 B 45

R のデータフレームには、次のような基本ルールがある。

  • 各行、各列が必ずラベルをもち、ラベルによる操作が可能である点が普通の行列と異なる (2)。ただし、1 次元のデータはラベルがなくても良さそう。
  • ラベルにスペースは駄目。

データフレームを作成する

手入力で作成

データフレーム A を直接入力で作るときは、


> A=data.frame(Blood_type=c("A","A","B"), Body_weight=c(65,59,45))


のようにする。以下のように > A とすることで、データフレームの内容を確認できる。

> A

Blood_type Body_weight
1 A 65
2 A 59
3 B 45


コピペで作成する

Excelテキストファイル などからコピペできる。Mac と Windows ではクリップボードの形式が違うので、このコマンドも異なることに注意する。

Mac (おそらく Linux も) では、データファイルにしたい領域をラベルも含めてコピーした後に、

> C=read.table(pipe("pbpaste"))

とする。または、1行目をヘッダーにするというオプションを加えて

> C=read.table(pipe("pbpaste"),header=TRUE)

とする方法もある。

ただし、この方法だと データ型 は data.frame になり、かつ V1, V2 というデータラベルが勝手につけられてしまう。R で統計をしたいときは vector 型が適しているので、このデータは vector 型に変換しておいた方がよい。ページ下方の「データフレームをベクトルに変換する」を参照のこと。

Windows では、このコマンドは read.table("clipboard") となる (3)。


Error log

  • Warning message: In read.table(pipe("pbpaste")):incomplete final line found by readTableHeader on 'pbpaste' というメッセージが現れた場合、一番下に一行空白行をクリップボードにコピーするようにすると、このメッセージが出なくなる。原因はよくわからない。
  • Windows R version 3.1.2 では、Error in read.table(pipe("pbpaste")): no lines available in input というエラーが出てしまう。

csv ファイルを読み込む

Excel を .csv で別名保存し、> A=read.csv('filename') で読み込むことができる (3)。 Windows R 3.1.2 で有効なことを確認(4-5-2015)。 filename には .csv を含める必要がある。

  • 同じディレクトリに csv ファイルがない場合は、パスを指定しなければならない。
  • 現在のディレクトリは > getwd() で調べることができる。

広告

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

列または行の番号で指定する

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

> A[2,]

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

> A[2:10,]

とする。

2 列目だけを抜き出すときはコンマ不要で

> A[2]

とする。MATLAB なら [2,:] とするところで、: を打たないでも「その行の全ての列」を指定することができると解釈しよう。数字の順番は行 → 列 である。> B[,2] とすると [1] 65 59 45 のように数値だけが抽出される。


<3>データラベルで指定する

また、データラベルを使った取り出し方もある。

> B$Blood_type

で Blood_type を指定した 1 列目のみを取り出すことができる。


2 つのデータフレームを結合する

R では複数のデータフレームを結合することができる。

Blood_type と Body_weight をそれぞれ 1 次元のデータとして作り、それを結合してみる。

> B1=c("A","A","B")
> B2=c(65,59,45)
> B2=data.frame(Blood_type=B1,Body_weight=B2)

で上の表が表示されるはずである。なお、> summary(B) で体重の平均値など、このデータフレームの簡単な解析結果もみることができる。


データフレームをベクトルに変換する

列ラベルを $ を使って指定するのがポイントだった。データフレーム A の 1 行目が V1 とラベルされているとき、単に以下でよい。

> B=A$V1

is.vector(B) とすると、B がベクトルなら TRUE、そうでないなら FALSE という結果が返ってくる。


広告

コメント欄

フォーラムを作ったので、各ページにあるコメント欄のうち、コメントがついていないものは順次消していきます。今後はフォーラムをご利用下さい。管理人に直接質問したい場合は、下のバナーからブログへ移動してコメントをお願いします。


References

  1. Rの data frame から行や列を選択して取り出す. Link.
  2. R-Tips 39. データフレーム事始. Link.
  3. 井関龍太のページ. Rでクリップボードからデータを読み込む. Link: Last access 2018/12/09.