Scal ramki danych w R: pełne i częściowe dopasowanie

Bardzo często dysponujemy danymi z wielu źródeł. Aby przeprowadzić analizę, musimy to zrobić łączyć dwie ramki danych razem z jedną lub większą liczbą wspólne kluczowe zmienne.

W tym samouczku dowiesz się

Pełny mecz

Pełne dopasowanie zwraca wartości, które mają odpowiednik w tabeli docelowej. Wartości, które nie są zgodne, nie zostaną zwrócone w nowej ramce danych. Częściowe dopasowanie zwraca jednak brakujące wartości jako NA.

Zobaczymy proste połączenie wewnętrzne. Słowo kluczowe internal Join wybiera rekordy, które mają pasujące wartości w obu tabelach. Aby połączyć dwa zbiory danych, możemy użyć funkcji merge(). Użyjemy trzech argumentów:

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

Przykład:

Utwórz pierwszy zbiór danych ze zmiennymi

  • nazwisko
  • narodowość

Utwórz drugi zbiór danych ze zmiennymi

  • nazwisko
  • filmy

Wspólną zmienną kluczową jest nazwisko. Możemy połączyć oba dane i sprawdzić, czy wymiarowość wynosi 7×3.

Dodajemy stringsAsFactors=FALSE w ramce danych, ponieważ nie chcemy R aby przekonwertować ciąg znaków na współczynnik, chcemy, aby zmienna była traktowana jako znak.

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

Wyjście:

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

Połączmy ramki danych, gdy wspólne zmienne kluczowe mają różne nazwy.

Zmieniamy nazwisko na imię w ramce danych filmów. Używamy funkcji identycznej(x1, x2), aby sprawdzić, czy obie ramki danych są identyczne.

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

Wyjście:

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

Wyjście:

## [1] TRUE

Oznacza to, że operacja scalania jest wykonywana nawet wtedy, gdy nazwy kolumn są różne.

Dopasowanie częściowe

Nie jest zaskakujące, że dwie ramki danych nie mają tych samych wspólnych kluczowych zmiennych. w pełne dopasowanie, ramka danych zwraca tylko wiersze znalezione w ramce danych x i y. Z częściowe połączenie, możliwe jest zachowanie wierszy bez pasujących wierszy w drugiej ramce danych. Te wiersze będą miały NA w tych kolumnach, które zwykle są wypełnione wartościami z y. Możemy to zrobić ustawiając all.x= TRUE.

Na przykład możemy dodać nowego producenta, Lucasa, do ramki danych producenta bez odniesień do filmów w ramce danych filmów. Jeśli ustawimy all.x= FALSE, R połączy tylko pasujące wartości w obu zbiorach danych. W naszym przypadku producent Lucas nie zostanie przyłączony do scalania, ponieważ brakuje go w jednym zbiorze danych.

Zobaczmy wymiar każdego wyjścia, gdy określimy all.x= TRUE i kiedy tego nie zrobimy.

# 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

Wyjście:

Dopasowanie częściowe

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

Wyjście:

## [1] 7 3
dim(m2)

Wyjście:

## [1] 7 3
dim(m3)

Wyjście:

## [1] 8 3

Jak widać, wymiar nowej ramki danych 8×3 w porównaniu z 7×3 dla m1 i m2. R zawiera NA dla brakującego autora w ramce danych książek.