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