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