ユーザーIDをキーにして2つのテーブルを連結
というわけで、データの結合に挑戦しましょう。年齢や性別といった属性情報テーブルとWebサイトの訪問履歴テーブルを、ユーザーIDをキーにしてひとつのテーブルにまとめるときに使えます。ExcelだとVlookup関数を使うイメージですね。
さっそくサンプルデータの読み込みと確認から始めましょう。ここでは、Cドライブ直下のdataフォルダに2つのサンプルデータ(data1.csvとdata2.csv)を格納しています。Rで扱いやすいよう、これらのデータを読み出して、それぞれ「data1」と「data2」と名前を付けておきます。
data1<-read.csv("c:/data/data1.csv",header=T)
data2<-read.csv("c:/data/data2.csv",header=T)
はい。上の2つのコマンドを実行したあと、data1とdata2をそれぞれ表示させてみましょう。
まずはdata1から。

こちらはdata2です。

data1は、ユーザーIDと氏名に加えて、ページビュー(PV)、滞在時間(TIME)、コンバージョンしたかどうか(CV)といった、Webサイトの訪問に関するデータです。一方data2は、ユーザーIDと氏名に加えて、年齢(AGE)と性別(SEX)といった属性情報のデータになっています。
ただ、data1に含まれるユーザーの数は10人なのに対して、data2の方は5人と少ないですね。ですので、連載でご紹介したcbind関数を使ってくっつけてしまうと、ユーザーIDが異なるデータが結合されてしまいます。意味ナイ、ダメ、ゼッタイ。
そこでこの番外編では、merge関数を使ったデータ結合についてご紹介します。
merge関数の使い方
いよいよ、merge関数の出番です!
m1<-merge(data1, data2, by="USERID", all=F)
このコマンドを解説していきましょう。
merge(X,Y, by=Z, all=T or F)
X,Y 結合するデータを指定します。ここでは、data1とdata2です。
Z キーとなる変数を指定します。ここではUSERIDです。
ちなみに、テーブルごとに変数名が異なるキーを指定することも可能です。Xの「USERID」とYの「ID」をキーとしたい場合は、by.x="USERID",by.y="ID"と書きます。
続いて、all=T or F という記述がありますが、allに対しては「T」か「F」を指定します。意味は以下のようになります。
all=T すべてのデータを残す
all=F キーとなるIDが共通のものだけを残す
この違いはちょっとわかりにくいので、それぞれ実例を見て確認しましょう。まずはall=Tから。
m1<-merge(data1, data2, by="USERID", all=T)
この実行結果は以下のようになります。

列の数が増えて、data1とdata2に含まれるデータが結合しています。all=Tは「すべてのデータを残す」という指定なので、データは10件あります。ただし、データ件数が多いdata1にしか存在しないユーザーの「年齢(AGE)」と「性別(SEX)」のところに「NA(Not Available)」と入っているのがわかります。
また、2つのテーブルに同じ名前の変数が存在した場合は、ヘッダ部分の変数名のところに、.xと.yという文字が自動的に付与されます。ここではNAME.xとNAME.yがそれに該当します。2件目のSUSUKIさんはdata1にはデータがありますが、data2にはありません。なので、NAME.yのところに<NA>と表示されています。
続いてall=Fです。
m2<-merge(data1, data2, by="USERID", all=F)
実行結果はこちらです。

このような結果になります。all=Fは「キーとなるIDが共通のものだけを残す」という指示なので、データ件数の少ないdata2に含まれるユーザーの分だけ、データが結合されています。必要に応じて適切なものを選択してください。
最後に
データの前処理は分析を行う前の非常に大切なプロセスです。極力自動化して間違いが発生しづらいようにしたいものですね。簡単ではありましたがお役に立てれば幸いです。ではまた!
See you!