Slå sammen datarammer i R: Full og delvis samsvar

Svært ofte har vi data fra flere kilder. For å utføre en analyse må vi fusjonere to datarammer sammen med en eller flere vanlige nøkkelvariabler.

I denne opplæringen lærer du

Full kamp

Et fullstendig samsvar returnerer verdier som har en motpart i destinasjonstabellen. Verdiene som ikke samsvarer, returneres ikke i den nye datarammen. Den delvise matchingen returnerer imidlertid de manglende verdiene som NA.

Vi vil se en enkel indre sammenføyning. Inner join-nøkkelordet velger poster som har samsvarende verdier i begge tabellene. For å slå sammen to datasett kan vi bruke funksjonen merge(). Vi vil bruke tre argumenter:

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

Eksempel:

Opprett første datasett med variabler

  • etternavn
  • nasjonalitet

Lag andre datasett med variabler

  • etternavn
  • filmer

Den vanlige nøkkelvariabelen er etternavn. Vi kan slå sammen begge dataene og sjekke om dimensjonaliteten er 7×3.

Vi legger til stringsAsFactors=FALSE i datarammen fordi vi ikke vil ha det R for å konvertere streng som faktor, vil vi at variabelen skal behandles som tegn.

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

Utgang:

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

La oss slå sammen datarammer når de vanlige nøkkelvariablene har forskjellige navn.

Vi endrer etternavn til navn i filmens dataramme. Vi bruker funksjonen identisk(x1, x2) for å sjekke om begge datarammene er identiske.

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

Utgang:

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

Utgang:

## [1] TRUE

Dette viser at fletteoperasjonen utføres selv om kolonnenavnene er forskjellige.

Delvis match

Det er ikke overraskende at to datarammer ikke har de samme felles nøkkelvariablene. I full matching, returnerer datarammen bare rader funnet i både x- og y-dataramme. Med delvis sammenslåing, er det mulig å beholde radene uten samsvarende rader i den andre datarammen. Disse radene vil ha NA i de kolonnene som vanligvis er fylt med verdier fra y. Vi kan gjøre det ved å sette all.x= TRUE.

For eksempel kan vi legge til en ny produsent, Lucas, i produsentdatarammen uten filmreferansene i filmdatarammen. Hvis vi setter all.x= FALSE, vil R bare slå sammen de samsvarende verdiene i begge datasettene. I vårt tilfelle vil ikke produsenten Lucas være med i sammenslåingen fordi den mangler i ett datasett.

La oss se dimensjonen til hver utgang når vi spesifiserer all.x= TRUE og når vi ikke gjø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

Utgang:

Delvis match

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

Utgang:

## [1] 7 3
dim(m2)

Utgang:

## [1] 7 3
dim(m3)

Utgang:

## [1] 8 3

Som vi kan se, er dimensjonen til den nye datarammen 8×3 sammenlignet med 7×3 for m1 og m2. R inkluderer NA for den manglende forfatteren i bokens dataramme.