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:
# 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.