Ühendage andmeraamid R: täielik ja osaline vaste

Väga sageli on meil andmeid mitmest allikast. Analüüsi tegemiseks peame ühendada kaks andmekaadrit koos ühe või mitmega tavalised võtmemuutujad.

Selles õpetuses saate teada

Täielik vaste

Täielik vaste tagastab väärtused, millel on sihttabelis vaste. Väärtusi, mis ei ühti, uues andmeraamis ei tagastata. Osaline vaste tagastab aga puuduvad väärtused NA-na.

Näeme lihtsat sisemine liitumine. Siseühenduse märksõna valib kirjed, millel on mõlemas tabelis vastavad väärtused. Kahe andmekogumi ühendamiseks saame kasutada funktsiooni merge(). Kasutame kolme argumenti:

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

Näide:

Looge esimene muutujatega andmestik

  • perekonnanimi
  • kodakondsus

Looge teine ​​muutujatega andmestik

  • perekonnanimi
  • Filmid

Üldine võtmemuutuja on perekonnanimi. Saame ühendada mõlemad andmed ja kontrollida, kas mõõtmed on 7 × 3.

Lisame andmeraami stringsAsFactors=FALSE, sest me ei taha R stringi teguriks teisendamiseks tahame, et muutujat käsitletaks märgina.

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

Väljund:

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

Ühendame andmeraamid, kui ühistel võtmemuutujatel on erinevad nimed.

Muudame filmi andmeraamis perekonnanime nimeks. Kasutame funktsiooni identsed (x1, x2), et kontrollida, kas mõlemad andmeraamid on identsed.

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

Väljund:

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

Väljund:

## [1] TRUE

See näitab, et liitmine toimub isegi siis, kui veergude nimed on erinevad.

Osaline vaste

Pole üllatav, et kahel andmeraamil ei ole samu ühiseid võtmemuutujaid. Aastal täielik sobitamine, tagastab andmeraam ainult ridu, mis on leitud nii x- kui ka y-andmeraamist. Koos osaline liitmine, on võimalik sobivate ridadeta ridu hoida teises andmeraamis. Nendel ridadel on NA nendes veergudes, mis on tavaliselt täidetud y väärtustega. Seda saame teha, kui määrame kõik.x= TRUE.

Näiteks saame lisada uue produtsendi Lucase tootjaandmete kaadrisse ilma filmi viideteta filmide andmeraamis. Kui määrame all.x= FALSE, ühendab R ainult mõlema andmestiku vastavad väärtused. Meie puhul ei liitu tootja Lucas ühendamisega, kuna see puudub ühest andmekogumist.

Vaatame iga väljundi dimensiooni, kui määrame kõik.x= TRUE ja millal mitte.

# 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

Väljund:

Osaline vaste

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

Väljund:

## [1] 7 3
dim(m2)

Väljund:

## [1] 7 3
dim(m3)

Väljund:

## [1] 8 3

Nagu näeme, on uue andmeraami mõõde 8 × 3 võrreldes 7 × 3 m1 ja m2 jaoks. R sisaldab raamatute andmeraamis puuduva autori NA-d.

Võta see postitus kokku järgmiselt: