Sloučit datové rámce v R: Úplná a částečná shoda

Velmi často máme data z více zdrojů. Abychom mohli provést analýzu, musíme spojit dva datové rámce společně s jedním nebo více společné klíčové proměnné.

V tomto tutoriálu se to naučíte

Kompletní zápas

Úplná shoda vrátí hodnoty, které mají protějšek v cílové tabulce. Hodnoty, které se neshodují, se v novém datovém rámci nevrátí. Částečná shoda však vrátí chybějící hodnoty jako NA.

Uvidíme jednoduchý vnitřní spojení. Klíčové slovo vnitřní spojení vybere záznamy, které mají v obou tabulkách odpovídající hodnoty. Ke spojení dvou datových sad můžeme použít funkci merge(). Použijeme tři argumenty:

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

Příklad:

Vytvořte první datovou sadu s proměnnými

  • příjmení
  • státní příslušnost

Vytvořte druhou datovou sadu s proměnnými

  • příjmení
  • filmy

Společnou klíčovou proměnnou je příjmení. Můžeme sloučit obě data a zkontrolovat, zda je rozměr 7×3.

Do datového rámce přidáme stringsAsFactors=FALSE, protože nechceme R abychom převedli řetězec jako faktor, chceme, aby se s proměnnou zacházelo jako se znakem.

# 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)

Výstup:

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

Pojďme sloučit datové rámce, když mají společné klíčové proměnné různá jména.

V datovém rámci filmů změníme příjmení na jméno. Pro kontrolu, zda jsou oba datové rámce totožné, použijeme funkci identické(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)

Výstup:

##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)

Výstup:

## [1] TRUE

To ukazuje, že operace sloučení se provádí, i když se názvy sloupců liší.

Částečná shoda

Není divu, že dva datové rámce nemají stejné společné klíčové proměnné. V úplná shoda, vrátí se datový rámec 👔 řádky nalezené v datovém rámci x i y. S částečné sloučení, je možné ponechat řádky bez odpovídajících řádků v jiném datovém rámci. Tyto řádky budou mít NA v těch sloupcích, které jsou obvykle vyplněny hodnotami z y. Můžeme to udělat nastavením all.x= TRUE.

Můžeme například přidat nového producenta, Lucase, do datového rámce producenta bez filmových odkazů v datovém rámci filmů. Pokud nastavíme all.x= FALSE, R spojí pouze odpovídající hodnoty v obou souborech dat. V našem případě se producent Lucas ke sloučení nepřipojí, protože chybí v jednom datasetu.

Podívejme se na rozměr každého výstupu, když zadáme all.x= TRUE a když ne.

# 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

Výstup:

Částečná shoda

# Compare the dimension of each data frame
dim(m1)

Výstup:

## [1] 7 3
dim(m2)

Výstup:

## [1] 7 3
dim(m3)

Výstup:

## [1] 8 3

Jak vidíme, rozměr nového datového rámce 8×3 ve srovnání s 7×3 pro m1 a m2. R zahrnuje NA pro chybějícího autora v datovém rámci knihy.