R言語のデータフレームについて、詳しく解説します。

Rのデータフレームについて

Rのデータフレームは、エクセルのシートのような表形式のデータ構造のことです。表形式のデータを使ったデータ分析や機械学習では必ず使われるため、基本的な操作を覚えることは必須になります。しかし、現在においてはRが標準で提供している関数を使うことはほぼなく、tidyverseパッケージに含まれている関数を使ってデータフレームを操作することが一般的です。ここでは、データフレームの構造を中心に解説し、Rが標準で提供している関数だけを使用します。実際にtidyverseパッケージを使ったデータフレームの操作は後日、お伝えする予定です。

データフレームの作成

データフレームを作成するにはdata.frame()を使用します。しかし、このdata.frame()を覚える必要はありません。なぜならば、データ分析や機械学習においてはデータが既に存在したうえで開始するからです。つまり、データフレームを作成するという感覚ではなく、CSVファイルなどのデータファイルをデータフレームとして読み込んだらデータフレームができていたような感覚になります。とはいえ、この記事のようにRの解説するときにはよく現れますので、data.frame()と出会ったら「データフレームを作成しているんだな」くらいの認識が持てれば十分です。


df <- data.frame(x1 = 1:10, x2 = letters[1:10], x3 = factor(c(rep("A", 4), rep("B", 3), rep("C", 3))))
df
(out)   x1 x2 x3
(out)1   1  a  A
(out)2   2  b  A
(out)3   3  c  A
(out)4   4  d  A
(out)5   5  e  B
(out)6   6  f  B
(out)7   7  g  B
(out)8   8  h  C
(out)9   9  i  C
(out)10 10  j  C

データフレームの各部の呼称

縦に並んでいるデータをデータフレームの列といい、横に並んでいるデータをデータフレームの行といいます。Rの初心者は列と行がどちらを表しているのか困惑するときがありますが、データの加工では列に対する操作なのか行に対する操作なのかで明確に方法が変わってきますので、列と行をしっかり区別できるようにしてください。また、列の最上段に表示されているものは列名といい、行の最左側に表示されているものを行名といいます。

データフレームの構造

データフレームは各列がそれぞれベクトルの構造を持っています。データフレームの構造を確認するにはstr()を使用します。


df |> str()
(out)'data.frame':	10 obs. of  3 variables:
(out) $ x1: int  1 2 3 4 5 6 7 8 9 10
(out) $ x2: chr  "a" "b" "c" "d" ...
(out) $ x3: Factor w/ 3 levels "A","B","C": 1 1 1 1 2 2 2 3 3 3

データフレームの列名ベクトルと行名ベクトルの取得

データフレームの列名ベクトルを取得するにはcolnames()を使用し、データフレームの行名ベクトルを取得するにはrownames()を使用します。


df |> colnames()
(out)[1] "x1" "x2" "x3"
(out)
df |> rownames()
(out) [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"

$による列ベクトルの取得

ここから、以下の内容は覚える必要はありません。
最初に述べたように、現在においてはRが標準で提供している関数を使うことはほぼなく、tidyverseパッケージに含まれている関数を使ってデータフレームを操作することが一般的だからです。今のところは、こういう操作ができるんだ、くらいの認識をもっていただければ十分です。
データフレームの列ベクトルを取得するには次のような方法があります。


df$x1
(out) [1]  1  2  3  4  5  6  7  8  9 10

[]によるデータ取得

データフレームに対して、「[(行名または行番号), (列名または列番号)]」を使用することにより、値、列ベクトル、行ベクトル、データフレームを取得できます。

列名または列番号による列選択

列名または列番号による列選択により、ベクトルまたはデータフレームを取得する方法は次になります。


df[, "x1"]
(out) [1]  1  2  3  4  5  6  7  8  9 10
(out)
df[, 2]
(out) [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
(out)
df[, c("x1", "x2")]
(out)   x1 x2
(out)1   1  a
(out)2   2  b
(out)3   3  c
(out)4   4  d
(out)5   5  e
(out)6   6  f
(out)7   7  g
(out)8   8  h
(out)9   9  i
(out)10 10  j
(out)
df[, c(2, 3)]
(out)   x2 x3
(out)1   a  A
(out)2   b  A
(out)3   c  A
(out)4   d  A
(out)5   e  B
(out)6   f  B
(out)7   g  B
(out)8   h  C
(out)9   i  C
(out)10  j  C

行名または行番号による行選択

行名または行番号による行選択により、ベクトルまたはデータフレームを取得する方法は次になります。


df["1", ]
(out)  x1 x2 x3
(out)1  1  a  A
(out)
df[2, ]
(out)  x1 x2 x3
(out)2  2  b  A
(out)
df[c("1", "2"), ]
(out)  x1 x2 x3
(out)1  1  a  A
(out)2  2  b  A
(out)
df[c(1, 2), ]
(out)  x1 x2 x3
(out)1  1  a  A
(out)2  2  b  A

列名または列番号と行名または行番号による行選択

列名または列番号と行名または行番号による行選択により、値またはベクトル、データフレームを取得する方法は次になります。


df[1, 1]
(out)[1] 1
(out)
df[5:10, c(2, 3)]
(out)   x2 x3
(out)5   e  B
(out)6   f  B
(out)7   g  B
(out)8   h  C
(out)9   i  C
(out)10  j  C

値の変更

値を変更するには次のように[]を用いる方法や列ベクトルにアクセスしてから変更する方法などがあります。


df[1, 1] <- 1000
df
(out)1  1000  a  A
(out)2     2  b  A
(out)3     3  c  A
(out)4     4  d  A
(out)5     5  e  B
(out)6     6  f  B
(out)7     7  g  B
(out)8     8  h  C
(out)9     9  i  C
(out)10   10  j  C
(out)
df$x2[2] <- "B"
df
(out)     x1 x2 x3
(out)1  1000  a  A
(out)2     2  B  A
(out)3     3  c  A
(out)4     4  d  A
(out)5     5  e  B
(out)6     6  f  B
(out)7     7  g  B
(out)8     8  h  C
(out)9     9  i  C
(out)10   10  j  C
R入門 データ構造 データフレーム詳説