一所懸命に手抜きする

デスクワークばかりのスポーツ嫌いで50歳も過ぎ、いよいよ足腰に衰えを感じつつある昨今。

rbind()拡張2~rbind(),cbind()を統合したというabind()関数

サンプル

テスト用サンプルを作成する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"
  1. 列名が異なっていても縦結合できています。
  2. 列名は最初のデータフレームから取得しています。
  3. データフレームを結合した結果のオブジェクト型はデータフレームです。

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 秘書室 白鳥麗子
  1. 列名が異なっていても縦結合(along=1)できています。
  2. 列名は最後のデータフレームから取得しています。
  3. データフレームを結合した結果のオブジェクト型は行列です。
  4. 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"
  1. 横結合(along=2)できています。
  2. 列ラベルは元のデータフレームから取得しています。
  3. データフレームを結合した結果のオブジェクト型は行列です。

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"
  1. 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))  とすれば可能であるとわかりました。

a-habakiri.hateblo.jp

a-habakiri.hateblo.jp