R でのデータ フレームのマージ: 完全一致および部分一致
多くの場合、複数のソースからのデータが存在します。 分析を実行するには、次のことを行う必要があります。 マージ XNUMX つのデータフレームと XNUMX つ以上のデータフレーム 共通キー変数.
このチュートリアルでは、
完全一致
完全に一致すると、宛先テーブルに対応する値が返されます。 一致しない値は、新しいデータ フレームでは返されません。 ただし、部分一致では欠損値が NA として返されます。
簡単な例を見てみましょう 内部結合。 内部結合キーワードは、両方のテーブルで一致する値を持つレコードを選択します。 XNUMX つのデータセットを結合するには、merge() 関数を使用できます。 XNUMX つの引数を使用します。
merge(x, y, by.x = x, by.y = y) Arguments: -x: The origin data frame -y: The data frame to merge -by.x: The column used for merging in x data frame. Column x to merge on -by.y: The column used for merging in y data frame. Column y to merge on
例:
変数を使用して最初のデータセットを作成する
- 姓
- 国籍
変数を使用して XNUMX 番目のデータセットを作成する
- 姓
- 映画
共通キー変数は姓です。 両方のデータをマージして、次元が 7×3 であるかどうかを確認できます。
データ フレームに stringsAsFactors=FALSE を追加します。 R 文字列を因子として変換するには、変数を文字として扱う必要があります。
# Create origin dataframe( producers <- data.frame( surname = c("Spielberg","Scorsese","Hitchcock","Tarantino","Polanski"), nationality = c("US","US","UK","US","Poland"), stringsAsFactors=FALSE) # Create destination dataframe movies <- data.frame( surname = c("Spielberg", "Scorsese", "Hitchcock", "Hitchcock", "Spielberg", "Tarantino", "Polanski"), title = c("Super 8", "Taxi Driver", "Psycho", "North by Northwest", "Catch Me If You Can", "Reservoir Dogs","Chinatown"), stringsAsFactors=FALSE) # Merge two datasets m1 <- merge(producers, movies, by.x = "surname") m1 dim(m1)
出力:
surname nationality title 1 Hitchcock UK Psycho 2 Hitchcock UK North by Northwest 3 Polanski Poland Chinatown 4 Scorsese US Taxi Driver 5 Spielberg US Super 8 6 Spielberg US Catch Me If You Can 7 Tarantino US Reservoir Dogs
共通キー変数の名前が異なる場合は、データフレームを結合してみましょう。
ムービーデータフレームでは姓を名前に変更します。 関数 Identify(x1, x2) を使用して、両方のデータフレームが同一かどうかを確認します。
# Change name of ` movies ` dataframe colnames(movies)[colnames(movies) == 'surname'] <- 'name' # Merge with different key value m2 <- merge(producers, movies, by.x = "surname", by.y = "name") # Print head of the data head(m2)
出力:
##surname nationality title ## 1 Hitchcock UK Psycho ## 2 Hitchcock UK North by Northwest ## 3 Polanski Poland Chinatown ## 4 Scorsese US Taxi Driver ## 5 Spielberg US Super 8 ## 6 Spielberg US Catch Me If You Can
# Check if data are identical identical(m1, m2)
出力:
## [1] TRUE
これは、列名が異なっていてもマージ操作が実行されることを示しています。
部分一致
XNUMX つのデータフレームに同じ共通キー変数がないことは驚くべきことではありません。 の中に 完全一致、データフレームが返されます の x と y の両方のデータ フレームで見つかった行。 と 部分的なマージ、一致する行がない行を他のデータ フレームに保持することが可能です。 これらの行では、通常 y の値が入力される列に NA が含まれます。 これを行うには、all.x= TRUE を設定します。
たとえば、ムービー データ フレーム内のムービー参照を使用せずに、新しいプロデューサー、Lucas をプロデューサー データ フレームに追加できます。 all.x= FALSE に設定すると、R は両方のデータセット内の一致する値のみを結合します。 この場合、プロデューサーの Lucas は XNUMX つのデータセットに欠落しているため、マージに参加しません。
all.x= TRUE を指定した場合と指定しない場合の各出力の次元を見てみましょう。
# Create a new producer add_producer <- c('Lucas', 'US') # Append it to the ` producer` dataframe producers <- rbind(producers, add_producer) # Use a partial merge m3 <-merge(producers, movies, by.x = "surname", by.y = "name", all.x = TRUE) m3
出力:
# Compare the dimension of each data frame dim(m1)
出力:
## [1] 7 3
dim(m2)
出力:
## [1] 7 3
dim(m3)
出力:
## [1] 8 3
ご覧のとおり、新しいデータ フレームのサイズは、m8 と m3 の 7×3 と比較して 1×2 です。 R には、書籍データ フレームに存在しない著者の NA が含まれています。