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:

Delvis matchning

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