Slå samman dataramar i R: Full och partiell matchning
Mycket ofta har vi data från flera källor. För att göra en analys måste vi göra det sammanfoga två dataramar tillsammans med en eller flera vanliga nyckelvariabler.
I den här handledningen kommer du att lära dig
Hel match
En fullständig matchning returnerar värden som har en motsvarighet i destinationstabellen. De värden som inte matchar kommer inte att returneras i den nya dataramen. Den partiella matchningen returnerar emellertid de saknade värdena som NA.
Vi kommer att se en enkel inre koppling. Nyckelordet inre join väljer poster som har matchande värden i båda tabellerna. För att sammanfoga två datamängder kan vi använda funktionen merge(). Vi kommer att använda tre argument:
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
Exempelvis:
Skapa första datamängden med variabler
- efternamn
- nationalitet
Skapa en andra datamängd med variabler
- efternamn
- filmer
Den vanliga nyckelvariabeln är efternamn. Vi kan slå samman båda data och kontrollera om dimensionaliteten är 7×3.
Vi lägger till stringsAsFactors=FALSE i dataramen eftersom vi inte vill R för att konvertera sträng som faktor vill vi att variabeln ska behandlas som tecken.
# 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)
Produktion:
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
Låt oss slå samman dataramar när de vanliga nyckelvariablerna har olika namn.
Vi byter efternamn till namn i filmens dataram. Vi använder funktionen identisk(x1, x2) för att kontrollera om båda dataramarna är identiska.
# 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)
Produktion:
##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)
Produktion:
## [1] TRUE
Detta visar att sammanslagningsoperationen utförs även om kolumnnamnen är olika.
Delvis matchning
Det är inte förvånande att två dataramar inte har samma gemensamma nyckelvariabler. I den full matchning, returnerar dataramen endast rader som finns i både x- och y-dataramen. Med partiell sammanslagning, är det möjligt att behålla raderna utan matchande rader i den andra dataramen. Dessa rader kommer att ha NA i de kolumner som vanligtvis är fyllda med värden från y. Vi kan göra det genom att ställa in all.x= TRUE.
Till exempel kan vi lägga till en ny producent, Lucas, i producentens dataram utan filmreferenserna i filmdataramen. Om vi ställer in all.x= FALSE, kommer R endast att sammanfoga de matchande värdena i båda datamängderna. I vårt fall kommer producenten Lucas inte att gå med i sammanslagningen eftersom den saknas i en datauppsättning.
Låt oss se dimensionen för varje utdata när vi anger all.x= TRUE och när vi inte gör det.
# 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
Produktion:
# Compare the dimension of each data frame dim(m1)
Produktion:
## [1] 7 3
dim(m2)
Produktion:
## [1] 7 3
dim(m3)
Produktion:
## [1] 8 3
Som vi kan se är dimensionen på den nya dataramen 8×3 jämfört med 7×3 för m1 och m2. R inkluderar NA för den saknade författaren i bokens dataram.