R で 2つのデータフレームを結合
R コードでデータを操作するとき、2つのデータフレームを 1つに結合する必要性に直面することがよくあります。このチュートリアルでは、R で 2つのデータフレームを効率的に結合する方法をいくつか見ていきます。
2つのデータフレーム x
と y
があり、いくつかの列が一致しているとします。例えば、x
と y
の 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 で 2つのデータフレームを結合するには rbind
を使用する
関数 rbind
は、データフレーム、ベクトル、行列などのデータ構造を行で結合します。この名前は row-bind の略です。
2つのデータフレームを結合するために rbind
を使用する場合、両方のデータフレームは同じ列を持つ必要があります。したがって、先ほどの例では、b
列をデータフレーム y
に追加する必要があります。これは以下のコマンドを実行することで行うことができます。
y$b <- NA
これで、y
データフレームは以下のようになるはずです。
以下のコマンドを実行することで、rbind
を使って x
と y
のデータフレームを新しい 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
データフレームに x
と y
の組み合わせを入力します。
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