LoginSignup
0
0

More than 1 year has passed since last update.

生物系のためのR超入門 (3) 【データ構造②: マトリクス、データフレーム】

Last updated at Posted at 2022-01-13

0. はじめに

前回はベクトルとリストを扱いました。
これらは要素が一直線に横に並んだ形をしていました。
その一方で、エクセルなどで実際に扱っているデータは縦と横を持つ表形式であることが多いです。
今回は縦と横の広がりを持つ2次元的なマトリクスとデータフレームをあつかいます。
【前回の記事はこちら】

0-1. はじめて登場する関数・記号

  • matrix()
    • 引数の条件を満たすマトリクスを作ります。
  • [,]
    • インデックスを指定し、マトリクスおよびデータフレームの要素を取り出します。
  • head()
    • データフレームを冒頭から任意の行数分だけ表示させます。
  • $
    • 列名を指定し、(マトリクスおよび)データフレームの要素を取り出します。
  • names()
    • 列名にアクセスします。

1. マトリクス

マトリクスをイメージするためには、数学における行列を思い浮かべるとよいでしょう。
マトリクスは行と列をもち、行数×列数の要素を保持することができます。
ただし要素のデータ型はすべて同じである必要があります。
これはベクトルと共通しており、縦長のベクトルを列として横に並べたのがマトリクスと考えるとよいでしょう。

1-1. matrix()をつかってマトリクスを作る

マトリクスはmatrix()を使って作ります。
まずは、要素がすべて1、2行、4列のマトリクスを作ってみましょう。
マトリクスを作るためには、要素行数列数の3つが必要であり、それぞれ第1,2および第3引数に指定します。
第1引数に1を指定すると、マス目にすべて1が入ります。
第2引数のnrownumber of rowsを、
第3引数のncolnumber of columnsの略で、それぞれに2と4を指定すると2行4列のマトリクスとなります。

> matrix(1,nrow=2,ncol = 4)
     [,1] [,2] [,3] [,4]
[1,]    1    1    1    1
[2,]    1    1    1    1

先ほどはすべて1という要素が入りましたが
第1引数に1:8を指定してやると1~8までの数値が順々に入っていきます。
この場合、第1引数の要素数は行数×列数と一致している必要があり、一致していないとエラーになります。

> matrix(1:8,nrow = 2,ncol = 4)
     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8
> matrix(1:10,nrow = 2,ncol = 4)
     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8
 警告メッセージ: 
 matrix(1:10, nrow = 2, ncol = 4) : 
   データ長 [10] が列数 [4] を整数で割ったもしくは掛けた値ではありません 

1-1. マトリクスの要素へのアクセス

マトリクスは行と列をもち、2次元的な広がりを持っているので、
要素へアクセスするためには、2つ数字を指定する必要があります。
マトリクスのx行y列にある要素にアクセスしたい場合、変数名の後ろに角括弧を使って[x,y]というように指定します。

> A<-matrix(1:8,nrow = 2,ncol = 4)
> A
     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8
> #2行目、3列目の要素にアクセスしたい
> A[2,3]
[1] 6
> #1行目、4列目の要素にアクセスしたい
> A[1,4]
[1] 7

x行目すべて、y列目すべてを取り出したいときは片方を空白にします。
取り出されたものはベクトルとして扱うことができます。

> #2行目だけ取り出したい
> A[2,]
[1] 2 4 6 8
> #4列目だけ取り出したい
> A[,4]
[1] 7 8

2. データフレーム

データフレームこそ、R統計の基礎となるデータ構造かもしれません。
マトリクスと同様に行と列の2次元的な広がりを持っていますが、
マトリクスと異なり、列内が同一のデータ型の要素であれば、列同士が異なるデータ型でもOKです。言葉で説明するのは難しいので2-2. で具体的に紹介します。

2-1. データフレームの作り方

これまで、ベクトルやマトリクスなどをR上でつくる方法を紹介してきましたが、
データフレームの作り方は割愛します。
と言いますのも、R上でデータフレームを作る機会より、エクセルなどで作成したデータファイルをデータフレームとして読み込ませる機会のほうがずっと多いと思われるためです。
エクセルで作ったデータファイルの読み込み方法はまたの機会に記事にする予定です。

2-2. データフレームの要素へのアクセス

データフレームの扱いを練習するために、Rにあらかじめ入っている練習用のデータフレームirisを開いてみましょう。
コンソールにirisと打ち込むだけで、OKです。
とても大きなデータフレームで150行まで続いています。

> iris
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
2           4.9         3.0          1.4         0.2  setosa
3           4.7         3.2          1.3         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa
5           5.0         3.6          1.4         0.2  setosa
6           5.4         3.9          1.7         0.4  setosa
7           4.6         3.4          1.4         0.3  setosa
8           5.0         3.4          1.5         0.2  setosa
9           4.4         2.9          1.4         0.2  setosa
10          4.9         3.1          1.5         0.1  setosa

#11行目以降は省略しました

大きなデータフレームを用いる場合、データをすべて表示させると画面がいっぱいいっぱいになり見難くなることがよくあります。データすべてではなく、冒頭少しだけ確認したい、という場合はhead()を使います。
第1引数にデータフレームの変数名を、第2引数に何行目まで表示させるかを指定すると、指定した行までのみ表示してくれます。試しに冒頭5行目までを表示させましょう。

> head(iris,5)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa

データフレームの要素へのアクセスの方法はマトリクスの要素へのアクセスと同様で、角括弧[,]を使って指定します。列だけ取り出したいときもマトリクスと同様です。
5列目にアクセスしたとき、Levelsというものが表示されていますが、あとで説明しますのでいったんスルーしてください。

> #2行目、1列目の要素にアクセスしたい
> iris[2,1]
[1] 4.9
> #4行目、5列目の要素にアクセスしたい
> iris[4,5]
[1] setosa
Levels: setosa versicolor virginica

> #3列目だけ取り出し、冒頭5つを表示させる
> head(iris[,3],5)
[1] 1.4 1.4 1.3 1.5 1.4
> #5列目だけ取り出し、冒頭5つを表示させる
> head(iris[,5],5)
[1] setosa setosa setosa setosa setosa
Levels: setosa versicolor virginica

先ほど、データフレームはマトリクスと異なり、列内が同一のデータ型の要素であれば、列同士が異なるデータ型でもOK、と述べました。
ここで、irisの3列目と5列目のデータ型を比較してみましょう。
データ型の確認にはclass()関数を使うのでした。(忘れてしまった方はこちら

3列目は数値、5列目は要因であることがわかります。
このように列同士を比較して、データ型が異なる場合でもOKというのがデータフレームの特徴です。
また、5列目にアクセスしたとき、Levelsというのが表示されていましたがこれは5列目がfactorであるためです。

> class(iris[,3])
[1] "numeric"
> class(iris[,5])
[1] "factor"

2-3. データフレームの列名

ほとんどのデータフレームは列名を持っています。
irisではSepal.LengthSepal.Widthなどという文字が表示されていました。これらが列名です。列名を持っていると、直接列名を指定して列にアクセスすることもできます。
この場合、変数名の後ろにドルマーク$を付け、さらにその後に列名を指定します。
角括弧[]を使って列にアクセスしたときと、出力結果が同じであることを確認してみてください。
どちらも同じ出力になるので、$を使うか[]を使うかは好みでしょう。

> #Sepal.Length列だけを取り出し、冒頭5つを表示させる
> head(iris$Sepal.Length,5)
[1] 5.1 4.9 4.7 4.6 5.0
> #Species列だけを取り出し、冒頭5つを表示させる
> head(iris$Species,5)
[1] setosa setosa setosa setosa setosa
Levels: setosa versicolor virginica

データフレームの列名にアクセスしたい場合、names()関数を使います。
引数にデータフレーム名を指定すると、列名をベクトルとして取得できます。
あとはベクトルと同じ扱いなので、各括弧[]を使えば要素にアクセスすることができます。

> names(iris)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length"
[4] "Petal.Width"  "Species"     

> #irisの3列目の列名は?
> names(iris)[3]
[1] "Petal.Length"

3. 次回

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0