43. データの結合(マージ)と整列(ソート)


データの結合と整列に関する関数一覧

データ加工に関する関数の一覧はこちら(以下に出てくる x と y はデータフレームとする).

コマンド

機能

ncol(x)

x の列数(項目数)を求める.

nrow(x)

x の行数(データ数)を求める.

names(x)

x の列名を表示する.

rbind(x, y)

x と y を縦に並べて結合する(x と y の列名が全て同じ場合).

cbind(x, y)

x と y を横に並べて結合する(x と y の行数が同じ場合).

data.frame(x, y)

x と y を横に並べて結合する(x と y の行数が同じ場合).

merge(x, y)

x と y を併合(マージ)する.通常は引数に all=T を指定し,データを全て残す.all=T を指定しなければデータの共通部分が結果として返される.

まず,データフレーム D1 と D2 を作成する.

 
 id     <- c("A","C","E")
 height <- c(158,177,166)
 D1     <- data.frame(ID=id, H=height)
 
 id     <- c("A","B","D","E")
 weight <- c( 51, 55, 57, 55)
 D2     <- data.frame(ID=id, W=weight)

 データフレーム D1

  ID   H
1  A 158
2  C 177
3  E 166

 データフレーム D2

  ID  W
1  A 51
2  B 55
3  D 57
4  E 55

データの結合(マージ)

2 つのデータフレームをマージ(併合)する場合は関数 merge() を用いる.関数 merge() は 2 つのデータフレームの両方にある列データ(この場合は ID )で紐付けをしてデータをマージ(併合)する.このとき,引数 all に何も指定しない場合は ID が共通しているデータのみを残して併合,T を指定した場合は全てのデータが併合される.また,引数 all.x と all.y でそれぞれのデータフレームにおいて,どちらのデータを残すか否か(all.x : 左結合,all.y : 右結合)を指定することが出来る.

 
 merge(D1, D2)

  ID   H  W
1  A 158 51
2  E 166 55

 ( D <- merge(D1, D2, all=T) )

  ID   H  W
1  A 158 51
2  C 177 NA
3  E 166 55
4  B  NA 55
5  D  NA 57

引数 by で,2 つのデータフレームを紐付けする列名(この場合は ID )を指定することも出来る.また,異なる列名で 2 つのデータフレームを紐付けする場合は,引数 by.x と by.y で指定すればよい.

列名は by.x で指定した名前となる.また,引数 sort に F を指定して自動的に整列するのを制御することも出来る.引数 by や by.x と by.y に名前のベクトルを指定すれば良い(例:merge(D1, D2, by.x=names(D1), by.y=names(D2), all=T)).

 
 ( merge(D1, D2, by="ID", all=T) )

  ID   H  W
1  A 158 51
2  C 177 NA
3  E 166 55
4  B  NA 55
........

 ( merge(D1, D3, by.x="ID", by.y="Num", all=T) )

  ID   H  W
1  A 158 51
2  C 177 NA
3  E 166 55
........

 データフレーム D3

 
  Num  W
1   A 51
2   B 55
3   D 57
4   E 55

データの整列(ソート)

ソートを行う場合は,まず関数 order(昇順の対象となる列) で順番を作成し,それを使ってデータフレームにアクセスすればよい.例として,先ほどマージしたデータフレーム D の W についてソートを行ってみる.

 
 sortlist <- order(D$W)
 ( D4 <- D[sortlist,] )

  ID   H  W
1  A 158 51
3  E 166 55
4  B  NA 55
5  D  NA 57
2  C 177 NA

ソート後は行番号がバラバラになる.行番号ラベルを変更する場合は以下のようにする.

 
 rownames(D4) <- c(1:nrow(D4))
 D4

  ID   H  W
1  A 158 51
2  E 166 55
...........

複数の列に対してソートを行う場合は関数 order(1番目の列, pmax(1番目の列, 2番目の列)) として順番を作成し,それを使ってデータフレームにアクセスすればよい.

 
 sortlist <- order(D$W, pmax(D$W, D$H)) 
 D[sortlist,]   # W を昇順に並べる
                # W で同じ値がある場合は H の小さい方を上にする
  ID   H  W
1  A 158 51
3  E 166 55
4  B  NA 55
5  D  NA 57
2  C 177 NA

 sortlist <- order(D$W, pmax(D$W, D$ID))
 D[sortlist,]   # W を昇順に並べる
                # W で同じ値がある場合は ID の小さい方を上にする
  ID   H  W
1  A 158 51
4  B  NA 55
3  E 166 55
5  D  NA 57
2  C 177 NA