Flet datarammer i R: Fuld og delvis match
Meget ofte har vi data fra flere kilder. For at udføre en analyse skal vi fusionere to datarammer sammen med en eller flere almindelige nøglevariabler.
I denne tutorial lærer du
Fuld match
Et fuldt match returnerer værdier, der har en modpart i destinationstabellen. De værdier, der ikke stemmer overens, returneres ikke i den nye dataramme. Den delvise match returnerer imidlertid de manglende værdier som NA.
Vi vil se en enkel indre sammenføjning. Inder join-nøgleordet vælger poster, der har matchende værdier i begge tabeller. For at forbinde to datasæt kan vi bruge merge()-funktionen. Vi vil bruge 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:
Opret første datasæt med variabler
- efternavn
- nationalitet
Opret andet datasæt med variabler
- efternavn
- film
Den fælles nøglevariabel er efternavn. Vi kan slå begge data sammen og tjekke om dimensionaliteten er 7×3.
Vi tilføjer stringsAsFactors=FALSE i datarammen, fordi vi ikke vil R for at konvertere streng som faktor, ønsker vi, at variablen 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)
Output:
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
Lad os flette datarammer, når de fælles nøglevariabler har forskellige navne.
Vi ændrer efternavn til navn i filmens dataramme. Vi bruger funktionen identisk(x1, x2) til at kontrollere, om begge datarammer 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)
Output:
##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)
Output:
## [1] TRUE
Dette viser, at fletteoperationen udføres, selvom kolonnenavnene er forskellige.
Delvis match
Det er ikke overraskende, at to datarammer ikke har de samme fælles nøglevariabler. I den fuld matchning, returnerer datarammen kun rækker fundet i både x- og y-dataramme. Med delvis sammensmeltning, er det muligt at beholde rækkerne uden matchende rækker i den anden dataramme. Disse rækker vil have NA i de kolonner, der normalt er fyldt med værdier fra y. Det kan vi gøre ved at indstille all.x= TRUE.
For eksempel kan vi tilføje en ny producent, Lucas, i producentens dataramme uden filmreferencerne i filmdatarammen. Hvis vi sætter all.x= FALSE, vil R kun forbinde de matchende værdier i begge datasæt. I vores tilfælde vil producenten Lucas ikke deltage i fusionen, fordi den mangler i ét datasæt.
Lad os se dimensionen af hvert output, når vi angiver all.x= TRUE, og hvornår vi ikke 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
Output:
# Compare the dimension of each data frame dim(m1)
Output:
## [1] 7 3
dim(m2)
Output:
## [1] 7 3
dim(m3)
Output:
## [1] 8 3
Som vi kan se, er dimensionen af den nye dataramme 8×3 sammenlignet med 7×3 for m1 og m2. R inkluderer NA for den manglende forfatter i bogens dataramme.