R で 2つのデータフレームを結合

Gustavo du Mortier 2023年1月30日
  1. R で 2つのデータフレームを結合するには rbind を使用する
  2. dplyr パッケージを使用する
  3. R でビッグデータフレームを結合する
R で 2つのデータフレームを結合

R コードでデータを操作するとき、2つのデータフレームを 1つに結合する必要性に直面することがよくあります。このチュートリアルでは、R で 2つのデータフレームを効率的に結合する方法をいくつか見ていきます。

2つのデータフレーム xy があり、いくつかの列が一致しているとします。例えば、xy の 2つのデータフレームがあるとします。

x <- data.frame(a=c(218, 415, 339), b=c(25, 19, 43), c=c(950, 872, 645))
y <- data.frame(a=c(309, 115), c=c(799, 814))

そして、それらを結合して、例えば z と呼ばれる 1つのデータフレームにする必要があります。このようなデータフレームは以下のようになります。

R データフレームの例

R で 2つのデータフレームを結合するには rbind を使用する

関数 rbind は、データフレーム、ベクトル、行列などのデータ構造を行で結合します。この名前は row-bind の略です。

2つのデータフレームを結合するために rbind を使用する場合、両方のデータフレームは同じ列を持つ必要があります。したがって、先ほどの例では、b 列をデータフレーム y に追加する必要があります。これは以下のコマンドを実行することで行うことができます。

y$b <- NA

これで、y データフレームは以下のようになるはずです。

R データフレームの例

以下のコマンドを実行することで、rbind を使って xy のデータフレームを新しい z のデータフレームに結合することができます。

x <- data.frame(a=c(218, 415, 339), b=c(25, 19, 43), c=c(950, 872, 645))
y <- data.frame(a=c(309, 115), c=c(799, 814))

y$b <- NA

z <- rbind(x, y)

出力:

    a  b   c
1 218 25 950
2 415 19 872
3 339 43 645
4 309 NA 799
5 115 NA 814

dplyr パッケージを使用する

rbind を使用するためだけに余分なコードを書いたり、データフレームに架空の列を追加したりしたくない場合は、dplyr パッケージをインストールして、単に使用するだけでよい。

z <- bind_rows(x, y)

これは、z データフレームに xy の組み合わせを入力します。

R でビッグデータフレームを結合する

これまでの例では、数行と 2〜3 列の小さなデータフレームでも問題なく動作します。しかし、大量の行と任意の数の列を持つ大きなデータセットをマージする必要がある場合は、以下のように高速に処理できる関数を書いた方が良いかもしれません。

quickmerge <- function(df1, df2) {
  df1.names <- names(df1)
  df2.names <- names(df2)
  df2.add <- setdiff(df1.names, df2.names)
  df1.add <- setdiff(df2.names, df1.names)
  if(length(df2.add) > 0) {
    for(i in 1:length(df2.add)) {
      df2[df2.add[i]] <- NA
    }
  }
  if(length(df1.add) > 0) {
    for(i in 1:length(df1.add)) {
      df1[df1.add[i]] <- NA
    }
  }
  return(rbind(df1, df2))
}

この関数は、まずデータフレーム内の列名を比較し、次に必要な列を追加して等しくなるようにします。最後に、rbind 関数を使って行を結合し、結果を返します。この関数を呼び出すには、rbind 関数を用います。

z <- quickmerge(x, y)

完全なサンプルコードは以下の通りです。

quickmerge <- function(df1, df2) {
  df1.names <- names(df1)
  df2.names <- names(df2)
  df2.add <- setdiff(df1.names, df2.names)
  df1.add <- setdiff(df2.names, df1.names)
  if(length(df2.add) > 0) {
    for(i in 1:length(df2.add)) {
      df2[df2.add[i]] <- NA
    }
  }
  if(length(df1.add) > 0) {
    for(i in 1:length(df1.add)) {
      df1[df1.add[i]] <- NA
    }
  }
  return(rbind(df1, df2))
}

x <- data.frame(a=c(218, 415, 339), b=c(25, 19, 43), c=c(950, 872, 645))
y <- data.frame(a=c(309, 115), c=c(799, 814))

z <- quickmerge(x, y)

print(z)

出力:

    a  b   c
1 218 25 950
2 415 19 872
3 339 43 645
4 309 NA 799
5 115 NA 814

関連記事 - R Data Frame