一所懸命に手抜きする

監査の仕事をしています。ITを利用し、良い意味で「手抜き」することは効率化と精度アップに役立つと思うんです。部下への引き継ぎのためにまずは諸々頭から引っ張り出そうとブログを始めました。

[ Main ]  [ 別館 ]
当ブログで取り上げられている事案やデータベース、人物等はすべてフィクションです。

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

広告を非表示にする