4 データセットの作成と加工

4.1 概要

このページでは

について解説します。

4.2 データの読み込み

調査や実験などで得たデータはテキストファイルやExcelファイルなど様々な形で保存されています。R でデータ分析を行うには、まずそれらのデータを R に読み込む必要があります。

データのファイル形式としてはテキストファイルやバイナリファイル、Excel や XML、SAS や SPSSのデータ、SQL などのデータベース、あるいは画像ファイルの場合もあるでしょう。R ではこれら様々なデータ形式を読み込むことが可能です。

本ページではテキストファイルとエクセルファイルの読み込み方法について解説します。

4.2.1 サンプルデータ

サンプルデータとして以下のものを使います。

各ファイルを右クリックから保存し、dataset という名前のフォルダを作ってそこに入れておいて下さい。
下図は job.txt ファイルの中身(一部)です。

 

このデータは datarium パッケージに含まれている jobsatisfaction データです。
このデータをテキストファイル(txt, csv, tsv)やエクセルファイル(xlsx)に保存したものです。

テキストファイルとは中身が文字だけのファイルのことです。拡張子は txt や csv や tsv など。
csv (comma-separated values): データをコンマ記号で区切ったテキストファイル。
tsv (tab-separated values): データをタブ記号で区切ったテキストファイル。

4.2.2 テキストファイルの読み込み

テキストファイルを読み込むには read.table() 関数を使います。
データフレームとしてファイルの内容が読み込まれます。

# txt ファイルの読み込み
data = read.table( file = "dataset/job.txt", header=T, sep = ",", stringsAsFactors = F )
head( data, 2 )
##   id gender education_level score
## 1  1   male          school  5.51
## 2  2   male          school  5.65

# csv ファイルの読み込み
data = read.table( file = "dataset/job.csv", header=T, sep = ",", stringsAsFactors = F )
head( data, 2 )
##   id gender education_level score
## 1  1   male          school  5.51
## 2  2   male          school  5.65

# tsv ファイルの読み込み
data = read.table( file = "dataset/job.tsv", header=T, sep = "\t", stringsAsFactors = F )
head( data, 2 )
##   id gender education_level score
## 1  1   male          school  5.51
## 2  2   male          school  5.65

引数の意味は以下のようです。

  • file: 読み込むファイルのパス
  • header: 読み込むファイルの1行目が変数名の行なら TRUE にする
  • sep: 区切り文字(separator)は何か
  • stringAsFactors: 文字を要因型に変換する場合は TRUE、文字列型にする場合は FALSE

file 引数について、上記の例ではカレントディレクトリ(getwd() 命令を実行して表示される場所)に dataset というフォルダを作成し、そのフォルダ内に job.txt ファイルがある状態を想定しています。

header 引数について、このテキストファイルは一行目が変数名の行になっているので TRUE にします。最初の行からデータの中身が始まるファイルの場合には FALSE にします。

sep 引数について、区切り文字がタブの場合は sep = “\t” とします。

read.table() 関数には他にも様々な引数があります。詳しくは help を確認して下さい。

この例で使った job.txt、job.csv、job.tsv の3つのファイルは実質的に同じものです。
txt ファイルと csv ファイルは拡張子が異なるだけでファイルの中身は同一ですし、tsvファイルは区切り文字がコンマの代わりにタブが使われているだけです。
結果的に、read.table() 関数を使って読み込まれたデータ(データフレーム)はどのファイルを読み込んだ場合でも同一の内容になります。

4.2.3 Excel ファイルの読み込み

エクセルファイルを R に読み込む一つの方法は、エクセル上でファイルを txt や csv などテキストファイルとして出力し、それを上術の方法で読み込むことです。

エクセルファイルを直接読み込みたい場合はパッケージを使います。openxlsx、xlsx、XLConnect など、エクセルの読み込み用の R パッケージはいくつかありますが、openxlsx 以外のパッケージは Java のインストールも必要になるため、ここでは openxlsx を使うことにします。

まずはパッケージをインストールします。

install.packages( "openxlsx" )

パッケージを読み込みます。

library( "openxlsx" )

read.xlsx() 関数を使ってエクセルファイルを読み込みます。

library( openxlsx )
data = read.xlsx( "dataset/job.xlsx" )
head( data )
##   id gender education_level score
## 1  1   male          school  5.51
## 2  2   male          school  5.65
## 3  3   male          school  5.07
## 4  4   male          school  5.51
## 5  5   male          school  5.94
## 6  6   male          school  5.80

4.3 データフレームの操作

このセクションで使うデータを用意します。

library( datarium )

job = as.data.frame( jobsatisfaction )

str( job )
## 'data.frame':    58 obs. of  4 variables:
##  $ id             : Factor w/ 58 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ gender         : Factor w/ 2 levels "male","female": 1 1 1 1 1 1 1 1 1 1 ...
##  $ education_level: Factor w/ 3 levels "school","college",..: 1 1 1 1 1 1 1 1 1 2 ...
##  $ score          : num  5.51 5.65 5.07 5.51 5.94 5.8 5.22 5.36 4.78 6.01 ...

job
##    id gender education_level score
## 1   1   male          school  5.51
## 2   2   male          school  5.65
## 3   3   male          school  5.07
## 4   4   male          school  5.51
## 5   5   male          school  5.94
## 6   6   male          school  5.80
## 7   7   male          school  5.22
## 8   8   male          school  5.36
## 9   9   male          school  4.78
## 10 10   male         college  6.01
## 11 11   male         college  6.01
## 12 12   male         college  6.45
## 13 13   male         college  6.45
## 14 14   male         college  6.38
## 15 15   male         college  6.74
## 16 16   male         college  6.09
## 17 17   male         college  6.30
## 18 18   male         college  5.58
## 19 19   male      university  9.13
## 20 20   male      university  9.28
## 21 21   male      university  8.84
## 22 22   male      university  9.28
## 23 23   male      university 10.00
## 24 24   male      university 10.00
## 25 25   male      university  9.57
## 26 26   male      university  8.99
## 27 27   male      university  9.13
## 28 28   male      university  8.70
## 29 29 female          school  5.80
## 30 30 female          school  5.94
## 31 31 female          school  5.22
## 32 32 female          school  5.65
## 33 33 female          school  6.38
## 34 34 female          school  6.38
## 35 35 female          school  6.09
## 36 36 female          school  5.51
## 37 37 female          school  5.51
## 38 38 female          school  4.93
## 39 39 female         college  6.52
## 40 40 female         college  6.67
## 41 41 female         college  5.94
## 42 42 female         college  6.38
## 43 43 female         college  7.10
## 44 44 female         college  7.10
## 45 45 female         college  6.81
## 46 46 female         college  6.23
## 47 47 female         college  6.23
## 48 48 female         college  5.65
## 49 49 female      university  8.26
## 50 50 female      university  8.41
## 51 51 female      university  9.13
## 52 52 female      university  9.57
## 53 53 female      university  9.42
## 54 54 female      university  8.84
## 55 55 female      university  8.55
## 56 56 female      university  7.97
## 57 57 female      university  6.52
## 58 58 female      university  7.39

job は 58 行・4 列のデータフレームです。

dim( job )
## [1] 58  4

4.3.1 角括弧を用いたデータの抽出

データフレーム変数の角括弧内にひとつのインデックス(整数値または文字列)を入れると、その番号(名前)の列のみからなるデータフレームが得られます。

# job の 4 列目(つまり score の列)のみを持つデータフレーム
score = job[ 4 ]
head( score )
##   score
## 1  5.51
## 2  5.65
## 3  5.07
## 4  5.51
## 5  5.94
## 6  5.80

# 上記と同じことの別の書き方
score = job[ "score" ]
head( score )
##   score
## 1  5.51
## 2  5.65
## 3  5.07
## 4  5.51
## 5  5.94
## 6  5.80

角括弧内にふたつのインデックスを入れると、その行・列に該当する値が得られます。

# 1行目・4列目のデータを得る
job[ 1, 4 ]
## [1] 5.51

# 1行目の score 列のデータを得る(結果は上と同じ)
job[ 1, "score" ]
## [1] 5.51

この時、インデックスにベクトルを使えば、複数行・複数列のデータが得られます。

# job の 1〜3 行目の score (ベクトル)
job[ 1:3, "score" ]
## [1] 5.51 5.65 5.07

# job の 1〜3 行目、gender 列と score 列を持つデータフレーム
job[ 1:3, c( "gender", "score" ) ]
##   gender score
## 1   male  5.51
## 2   male  5.65
## 3   male  5.07

上の例では、指定した列が1つだけだと返り値はベクトルですが、列が2つ以上の場合は返り値はデータフレームになることに注意してください。

返り値をデータフレームにしたい場合は引数に drop = FALSE を加えます。

# job の 1〜3 行目の score (データフレーム)
job[ 1:3, "score", drop = F ]
##   score
## 1  5.51
## 2  5.65
## 3  5.07

2つのインデックスのうち片方を空にすると「全て」を意味するようになります。

# job の 1〜3 行目の、全ての列
job[ 1:3, ]
##   id gender education_level score
## 1  1   male          school  5.51
## 2  2   male          school  5.65
## 3  3   male          school  5.07

# job の全ての行の score
job[ , "score" ]
##  [1]  5.51  5.65  5.07  5.51  5.94  5.80  5.22  5.36  4.78  6.01  6.01  6.45
## [13]  6.45  6.38  6.74  6.09  6.30  5.58  9.13  9.28  8.84  9.28 10.00 10.00
## [25]  9.57  8.99  9.13  8.70  5.80  5.94  5.22  5.65  6.38  6.38  6.09  5.51
## [37]  5.51  4.93  6.52  6.67  5.94  6.38  7.10  7.10  6.81  6.23  6.23  5.65
## [49]  8.26  8.41  9.13  9.57  9.42  8.84  8.55  7.97  6.52  7.39

4.3.2 条件に合う列の抽出

job データフレームから、男性の score のみを取り出したいとします。
男性のデータが 1 行目から 28 行目までだと知っていれば、これは以下のようにできます。

job[ 1:28, "score" ]
##  [1]  5.51  5.65  5.07  5.51  5.94  5.80  5.22  5.36  4.78  6.01  6.01  6.45
## [13]  6.45  6.38  6.74  6.09  6.30  5.58  9.13  9.28  8.84  9.28 10.00 10.00
## [25]  9.57  8.99  9.13  8.70

ただし、行の範囲がいつでも簡単に分かるわけではありません。例えば学歴が大学である行を抽出したい場合などは、該当する行が全て連続した場所にあるわけではなく探すのが面倒になります。

条件に一致する行を自動で見つけるには == 演算子を使います。

以下のような式を実行すると、job の各行がその条件に合致するかを示す論理値型のベクトルが得られます。

# gender が "male" であるかどうかを示すベクトル
job$gender == "male"
##  [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [13]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [25]  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [49] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

# education_level が "university" であるかどうかを示すベクトル
job$education_level == "university"
##  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [13] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [25]  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [49]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE

この論理値ベクトルをインデックスとして使うと、条件に一致した行が抽出できます。

# gender が "male" である行の score のベクトル
job[ job$gender == "male", "score" ]
##  [1]  5.51  5.65  5.07  5.51  5.94  5.80  5.22  5.36  4.78  6.01  6.01  6.45
## [13]  6.45  6.38  6.74  6.09  6.30  5.58  9.13  9.28  8.84  9.28 10.00 10.00
## [25]  9.57  8.99  9.13  8.70

# education_level が "university" である行の score のベクトル
job[ job$education_level == "university", "score" ]
##  [1]  9.13  9.28  8.84  9.28 10.00 10.00  9.57  8.99  9.13  8.70  8.26  8.41
## [13]  9.13  9.57  9.42  8.84  8.55  7.97  6.52  7.39

素晴らしいですね。

ちなみに、コンマを消した以下の命令はエラーになります。

# 間違った命令
job[ job$education_level == "university" ]
## Error in `[.data.frame`(job, job$education_level == "university"): undefined columns selected

なぜエラーかというと、最初に説明したように、角括弧内に引数をひとつだけ入れた場合は抽出する列を指定していることになります。job は 4 つの列を持ったデータフレームなのに対し、角括弧内のベクトルの長さは 58 で、job が持つ列の数をオーバーしてしまっています。エラーメッセージはそのことを言っています。

4.3.3 複数条件でのマッチング

複数の条件を同時に満たす行を抽出したい場合は、== 演算子の式を & でつなぎます。

# 男性かつ大学卒という条件に一致するかを示す論理値ベクトル
job$gender == "male" & job$education_level == "university"
##  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [13] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [25]  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [49] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

これを行のインデックスとして使います。

# 性別が男性かつ学歴が大学である行の score を抽出
job[ job$gender == "male" & job$education_level == "university", "score" ]
##  [1]  9.13  9.28  8.84  9.28 10.00 10.00  9.57  8.99  9.13  8.70

また、ある列に関して複数の要素に一致するかを判定する場合は %in% 演算子を使います。

# 学歴がカレッジまたは大学の行を抽出
job$score[ job$education_level %in% c( "college", "university" ) ]
##  [1]  6.01  6.01  6.45  6.45  6.38  6.74  6.09  6.30  5.58  9.13  9.28  8.84
## [13]  9.28 10.00 10.00  9.57  8.99  9.13  8.70  6.52  6.67  5.94  6.38  7.10
## [25]  7.10  6.81  6.23  6.23  5.65  8.26  8.41  9.13  9.57  9.42  8.84  8.55
## [37]  7.97  6.52  7.39

4.3.4 $ 記法を使ったベクトルの抽出

データフレームでは $ 記号を使うと特定の列をベクトルとして取り出せます。

# score 列のベクトルを得る
job$score
##  [1]  5.51  5.65  5.07  5.51  5.94  5.80  5.22  5.36  4.78  6.01  6.01  6.45
## [13]  6.45  6.38  6.74  6.09  6.30  5.58  9.13  9.28  8.84  9.28 10.00 10.00
## [25]  9.57  8.99  9.13  8.70  5.80  5.94  5.22  5.65  6.38  6.38  6.09  5.51
## [37]  5.51  4.93  6.52  6.67  5.94  6.38  7.10  7.10  6.81  6.23  6.23  5.65
## [49]  8.26  8.41  9.13  9.57  9.42  8.84  8.55  7.97  6.52  7.39

# score の 3 番目の要素を得る
job$score[ 3 ]
## [1] 5.07

== 演算子を使った式を使えば、条件に一致した値のみを抽出できます。

# 性別が男性の行のみの score を得る
job$score[ job$gender == "male" ]
##  [1]  5.51  5.65  5.07  5.51  5.94  5.80  5.22  5.36  4.78  6.01  6.01  6.45
## [13]  6.45  6.38  6.74  6.09  6.30  5.58  9.13  9.28  8.84  9.28 10.00 10.00
## [25]  9.57  8.99  9.13  8.70

# 学歴が大学の行のみの score を得る
job$score[ job$education_level == "university" ]
##  [1]  9.13  9.28  8.84  9.28 10.00 10.00  9.57  8.99  9.13  8.70  8.26  8.41
## [13]  9.13  9.57  9.42  8.84  8.55  7.97  6.52  7.39

最初に説明した方法と比べてみます。以下のそれぞれは同じ結果になります。

# 男性のみの score
job[ job$gender == "male", "score" ]
##  [1]  5.51  5.65  5.07  5.51  5.94  5.80  5.22  5.36  4.78  6.01  6.01  6.45
## [13]  6.45  6.38  6.74  6.09  6.30  5.58  9.13  9.28  8.84  9.28 10.00 10.00
## [25]  9.57  8.99  9.13  8.70

# 男性のみの score
job$score[ job$gender == "male" ]
##  [1]  5.51  5.65  5.07  5.51  5.94  5.80  5.22  5.36  4.78  6.01  6.01  6.45
## [13]  6.45  6.38  6.74  6.09  6.30  5.58  9.13  9.28  8.84  9.28 10.00 10.00
## [25]  9.57  8.99  9.13  8.70

$ 記号を使った場合でも & を使った複数条件のマッチングが可能です。

# 男性かつ大学卒の score を得る
job$score[ job$gender == "male" & job$education_level == "university" ]
##  [1]  9.13  9.28  8.84  9.28 10.00 10.00  9.57  8.99  9.13  8.70

補足: $[[ ]]

データフレームはリストなので、$ の代わりに [[ ]] も使えます。

# この 3 つは同じこと
job$score
job[[ 4 ]]
job[[ "score" ]]

# 従って、以下の 3 つも同じこと
job$score[ job$gender == "male" ]
job[[ 4 ]][ job$gender == "male" ]
job[[ "score" ]][ job$gender == "male" ]

4.3.5 subset() 関数を用いたデータフレームの抽出

ここまで、条件に一致する行の抽出を角括弧を使って行う方法を説明してきました。
実は、データフレームの条件マッチングを行うための別の(そして便利な)方法があります。

subset() 関数を使うとデータフレームから特定の行や列の抽出ができます。
subset( x, subset, select ) という引数を持ちます。
第1引数は処理したいデータフレームです。

subset 引数

subset 引数には抽出したい行の条件式を入れます。

# education_level が "university" である行を抽出
subset( job, subset = education_level == "university" )
# (結果は省略)

# 男性かつ大学卒である行を抽出
subset( job, subset = gender == "male" & education_level == "university" )
# (結果は省略)

%in% 演算子を使った例。

# education_level が "college" または "university" である行を抽出
subset( job, subset = education_level %in% c( "college", "university" ) )
# (結果は省略)

> 演算子を使った例。

# score が 9.5 以上の行を抽出
subset( job, subset = score > 9.5 )
##    id gender education_level score
## 23 23   male      university 10.00
## 24 24   male      university 10.00
## 25 25   male      university  9.57
## 52 52 female      university  9.57

subset 引数に入れる条件式においては $ 記号は使う必要はありません。つまり、
subset( job, subset = job$score > 9.5 )
といった書き方をする必要はありません(そう書いてもエラーにはならず同じ結果が得られますが)。
列の名前だけを書けば良いので、スクリプトが書きやすくまた見やすくなるメリットがあります。

select 引数

select 引数を使うと特定の列を抽出できます。

# gender の列のみのデータフレームを得る
subset( job, select = gender )
# (結果は省略)

# gender と score の列のみのデータフレームを得る
subset( job, select = c( gender, score ) )
# (結果は省略)

# 列名を引用符で囲う必要はない(そう書いてもエラーにはならないし同じ結果が得られるが)
subset( job, select = "gender" )
# (結果は省略)

便利な記法として、マイナス記号を使うことで特定の列の除外を行うことができます。

# job データ
head( job, 3 )
##   id gender education_level score
## 1  1   male          school  5.51
## 2  2   male          school  5.65
## 3  3   male          school  5.07

# gender 列のみ除外したデータフレームを得る
head( subset( job, select = -gender ), 3 )
##   id education_level score
## 1  1          school  5.51
## 2  2          school  5.65
## 3  3          school  5.07

# id 列と education_level 列を除外したデータフレームを得る
head( subset( job, select = -c( id, education_level ) ), 3 )
##   gender score
## 1   male  5.51
## 2   male  5.65
## 3   male  5.07

データフレームに不要な列がありそれを捨てたい場合などに便利です。

特定の列をデータフレームから削除したい場合は列に NULL を代入する方法もあります。

# subset 関数を使って gender 列を除外する方法
s1 = subset( job, select = -gender )
head( s1, 3 )
##   id education_level score
## 1  1          school  5.51
## 2  2          school  5.65
## 3  3          school  5.07

# NULL の代入によって gender 列を除外する方法
job$gender = NULL
head( job, 3 )
##   id education_level score
## 1  1          school  5.51
## 2  2          school  5.65
## 3  3          school  5.07

# job を元に戻しておきます
job = as.data.frame( datarium::jobsatisfaction )

subset 引数と select 引数を同時に指定する

subset 引数と select 引数は同時に指定することができます。

# 学歴が大学の行を抽出し、gender と score の列からなるデータフレームを得る
dat = subset( job,
    subset = education_level == "university",
    select = c( gender, score ) )

head( dat )
##    gender score
## 19   male  9.13
## 20   male  9.28
## 21   male  8.84
## 22   male  9.28
## 23   male 10.00
## 24   male 10.00

4.3.6 データ抽出のまとめ

性別が female で、学歴が university である人のscore の平均値を計算する、という状況を想定してデータ抽出方法についてまとめておきます。

分かりやすさのため、変数名をベクトルは v、データフレームは df としています。

v = job[ job$gender == "female" & job$education_level == "university", "score" ]
v
##  [1] 8.26 8.41 9.13 9.57 9.42 8.84 8.55 7.97 6.52 7.39
mean( v )
## [1] 8.406

v = job$score[ job$gender == "female" & job$education_level == "university" ]
v
##  [1] 8.26 8.41 9.13 9.57 9.42 8.84 8.55 7.97 6.52 7.39
mean( v )
## [1] 8.406

df = subset( job, subset = gender == "female" & education_level == "university" )
df
##    id gender education_level score
## 49 49 female      university  8.26
## 50 50 female      university  8.41
## 51 51 female      university  9.13
## 52 52 female      university  9.57
## 53 53 female      university  9.42
## 54 54 female      university  8.84
## 55 55 female      university  8.55
## 56 56 female      university  7.97
## 57 57 female      university  6.52
## 58 58 female      university  7.39
mean( df$score )
## [1] 8.406

v = subset( job, subset = gender == "female" & education_level == "university" )$score
v
##  [1] 8.26 8.41 9.13 9.57 9.42 8.84 8.55 7.97 6.52 7.39
mean( v )
## [1] 8.406

同じことをするのに複数のやり方があるのはややこしいことなのですが、どの書き方も R ではよく使われるので慣れておく必要があります。

4.3.7 データフレームの列順の並べ替え

job データは id, gender, education_level, socre という順で列が並んでいます。

何らかの理由でその並び順を変えたい場合は、以下のようにします。

# 現在の job データ
head( job, 3 )
##   id gender education_level score
## 1  1   male          school  5.51
## 2  2   male          school  5.65
## 3  3   male          school  5.07

# 列を指定した順番に並び替える
cname = c( "id", "education_level", "gender", "score" )
dat = job[ , c( cname, setdiff( names( job ), cname ) ) ]
head( dat, 3 )
##   id education_level gender score
## 1  1          school   male  5.51
## 2  2          school   male  5.65
## 3  3          school   male  5.07

# socre と gender を先頭に移動させ、それ以外の列はそのまま後ろにつなげる
cname = c( "score", "gender" )
dat = job[ , c( cname, setdiff( names( job ), cname ) ) ]
head( dat, 3 )
##   score gender id education_level
## 1  5.51   male  1          school
## 2  5.65   male  2          school
## 3  5.07   male  3          school

並び替え後の列名のベクトルを作り(ここでは変数名を cname としてます)、setdiff 関数を利用して並べ替え後の列名ベクトルを作成しています。

4.3.8 結合

複数のデータフレームを結合する方法について説明します。
横方向の結合および縦方向の結合があります。

4.3.8.1 横方向の結合

例として以下のような df1 と df2 という2つのデータフレームがあったとします。

df1 = data.frame( id = 1:3, name = c( "Alice", "Bob", "Charles" ) )
df1
##   id    name
## 1  1   Alice
## 2  2     Bob
## 3  3 Charles

df2 = data.frame( age = c( 10, 20, 30 ), sex = c( "female", "male", "male" ) )
df2
##   age    sex
## 1  10 female
## 2  20   male
## 3  30   male

cbind() 関数を使ってこれらを結合できます。

df = cbind( df1, df2 )
df
##   id    name age    sex
## 1  1   Alice  10 female
## 2  2     Bob  20   male
## 3  3 Charles  30   male

この時、df1 と df2 の行数が同じである必要があります(同じでない場合はエラーになる)。

4.3.8.2 縦方向の結合

例として以下のような df1 と df2 という2つのデータフレームがあったとします。

df1 = data.frame( id = 1:2, name = c( "Alice", "Bob" ) )
df1
##   id  name
## 1  1 Alice
## 2  2   Bob

df2 = data.frame( id = 3:4, name = c( "Charles", "Dick" ) )
df2
##   id    name
## 1  3 Charles
## 2  4    Dick

rbind() 関数を使ってこれらを結合できます。

df = rbind( df1, df2 )
df
##   id    name
## 1  1   Alice
## 2  2     Bob
## 3  3 Charles
## 4  4    Dick

異なる列数のデータフレームを縦方向に結合したい場合は dplyr パッケージの bind_rows() 関数を使います。

df1 = data.frame( id = 1:2, name = c( "Alice", "Bob" ), age = c( 10, 20 ) )
df1
##   id  name age
## 1  1 Alice  10
## 2  2   Bob  20

df2 = data.frame( id = 3:4, name = c( "Charles", "Dick" ) )
df2
##   id    name
## 1  3 Charles
## 2  4    Dick

library( dplyr )
bind_rows( df1, df2 )
##   id    name age
## 1  1   Alice  10
## 2  2     Bob  20
## 3  3 Charles  NA
## 4  4    Dick  NA