サンプル
テスト用サンプルを作成するRコードはマイブログ内テスト用Rサンプルを作成するコード - 一所懸命に手抜きするにあります。
列名が違う場合に縦結合可能とする方法(2)~項目順は同じ~ abind()
列数が同じならば列名が違っても縦結合する方法には abind()関数を用いるという方法もあります。
abind packageに含まれています。Combine multi-dimensional arrays. This is a generalization of cbind and rbind. Takes a sequence of vectors, matrices, or arrays and produces a single array of the same or higher dimension.(http://svitsrv25.epfl.ch/R-doc/library/abind/html/abind.html)とあり、縦結合・横結合の双方に対応しています。
library("abind") abind(..., along=N, rev.along=NULL, new.names=NULL, force.array=TRUE, make.names=use.anon.names, use.anon.names=FALSE, use.first.dimnames=FALSE) # 通常 along =1 縦結合 ,along=2 横結合 ,along=3 配列 # use.first.dimnames=FALSE 最後のデータのラベルを使用、 # TRUEにすると最初のデータのラベルを使用
動作確認
rbindCOrder
まずは、前に作った rbindCOrder の挙動を確認します。
(w<-rbindCOrder(社員台帳,社員マスタ,社員マスタ2)) ##社員番号 部署 氏名 ##1 1 営業部 山田太郎 ##2 2 営業部 鈴木花子 ##3 3 総務部 杉本一郎 ##4 4 財務部 支払益子 ##5 5 経理部 会計主水 ##6 6 秘書室 白鳥麗子 class(w) ##[1] "data.frame"
- 列名が異なっていても縦結合できています。
- 列名は最初のデータフレームから取得しています。
- データフレームを結合した結果のオブジェクト型はデータフレームです。
abind(,along=1)
次にabind()に引数 along=1 を指定してみます。
(x<-abind(社員台帳,社員マスタ,社員マスタ2,along=1)) ## 社員番号 所属 名前 ##[1,] "1" "営業部" "山田太郎" ##[2,] "2" "営業部" "鈴木花子" ##[3,] "3" "総務部" "杉本一郎" ##[4,] "4" "財務部" "支払益子" ##[5,] "5" "経理部" "会計主水" ##[6,] "6" "秘書室" "白鳥麗子" class(x) ##[1] "matrix" data.frame(x) ## 社員番号 部署 氏名 ##1 1 営業部 山田太郎 ##2 2 営業部 鈴木花子 ##3 3 総務部 杉本一郎 ##4 4 財務部 支払益子 ##5 5 経理部 会計主水 ##6 6 秘書室 白鳥麗子
- 列名が異なっていても縦結合(along=1)できています。
- 列名は最後のデータフレームから取得しています。
- データフレームを結合した結果のオブジェクト型は行列です。
- data.frame()で行列を変換すればデータフレーム型になります。
abind(,along=2)
続いてabind()に引数 along=2 を指定してみます。
(y<-abind(社員台帳,社員マスタ,社員マスタ2,along=2)) ## 社員番号 部署 氏名 社員番号 所属 名前 社員番号 所属 名前 ##[1,] "1" "営業部" "山田太郎" "3" "総務部" "杉本一郎" "5" "経理部" "会計主水" ##[2,] "2" "営業部" "鈴木花子" "4" "財務部" "支払益子" "6" "秘書室" "白鳥麗子" class(y) ##[1] "matrix"
- 横結合(along=2)できています。
- 列ラベルは元のデータフレームから取得しています。
- データフレームを結合した結果のオブジェクト型は行列です。
abind(,along=3)
一応、abind()に引数 along=3 を指定した場合をみてみます。
(z<-abind(社員台帳,社員マスタ,社員マスタ2,along=3)) ##, , 1 ## ## 社員番号 所属 名前 ##[1,] "1" "営業部" "山田太郎" ##[2,] "2" "営業部" "鈴木花子" ## ##, , 2 ## ## 社員番号 所属 名前 ##[1,] "3" "総務部" "杉本一郎" ##[2,] "4" "財務部" "支払益子" ## ##, , 3 ## ## 社員番号 所属 名前 ##[1,] "5" "経理部" "会計主水" ##[2,] "6" "秘書室" "白鳥麗子" ## class(z) ##[1] "array"
- along=NのNは次元のようで、3次元ということで配列となっています。
abind(,along=1,use.first.dimnames=TRUE)
一応、abind()に引数 ,along=1,use.first.dimnames=TRUE を指定した場合をみてみます。
(abind(社員台帳,社員マスタ,社員マスタ2,along=1,use.first.dimnames=TRUE)) ## 社員番号 部署 氏名 ##[1,] "1" "営業部" "山田太郎" ##[2,] "2" "営業部" "鈴木花子" ##[3,] "3" "総務部" "杉本一郎" ##[4,] "4" "財務部" "支払益子" ##[5,] "5" "経理部" "会計主水" ##[6,] "6" "秘書室" "白鳥麗子"
use.first.dimnames=TRUE だと最初のデータから列名を取得するようです。
結論
列数や内容が同じだけれど列名が異なるというデータフレームを縦に結合するには、 data.frame(abind(X,along=1,use.first.dimnames=TRUE)) とすれば可能であるとわかりました。