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 が含まれています。