Samouczek Dplyr: Scal i połącz dane w R z przykładami
Wprowadzenie do analizy danych
Analizę danych można podzielić na trzy części:
- Ekstrakcja: Najpierw musimy zebrać dane z wielu źródeł i połączyć je.
- Przekształcać: Ten krok obejmuje manipulację danymi. Po skonsolidowaniu wszystkich źródeł danych możemy przystąpić do ich czyszczenia.
- Wyobrażać sobie: Ostatnim krokiem jest wizualizacja naszych danych w celu sprawdzenia nieprawidłowości.

Jednym z najważniejszych wyzwań stojących przed badaczami danych jest manipulacja danymi. Dane nigdy nie są dostępne w żądanym formacie. Analitycy danych muszą spędzać co najmniej połowę swojego czasu na czyszczeniu danych i manipulowaniu nimi. To jedno z najważniejszych zadań w tej pracy. Jeśli proces manipulacji danymi nie będzie kompletny, precyzyjny i rygorystyczny, model nie będzie działał poprawnie.
R Dplyr
R ma bibliotekę o nazwie dplyr, która pomaga w transformacji danych. Biblioteka dplyr składa się zasadniczo z czterech funkcji służących do manipulowania danymi i pięciu czasowników służących do czyszczenia danych. Następnie możemy użyć biblioteki ggplot do analizy i wizualizacji danych.
Dowiemy się, jak używać biblioteki dplyr do manipulowania plikiem Ramka danych.
Scal dane za pomocą R Dplyr
dplyr zapewnia przyjemny i wygodny sposób łączenia zestawów danych. Możemy mieć wiele źródeł danych wejściowych i w pewnym momencie będziemy musieli je połączyć. Sprzężenie z dplyr dodaje zmienne na prawo od oryginalnego zbioru danych.
Dplyr dołącza
Poniżej przedstawiono cztery ważne typy połączeń używanych w programie dplyr do scalania dwóch zestawów danych:
| Funkcjonować | Cel | Argumenty | Wiele kluczy |
|---|---|---|---|
| left_join() | Połącz dwa zbiory danych. Zachowaj wszystkie obserwacje z tabeli początkowej | dane, pochodzenie, miejsce docelowe, według = „ID” | początek, miejsce docelowe, by = c(“ID”, “ID2”) |
| prawo_dołącz() | Połącz dwa zbiory danych. Zachowaj wszystkie obserwacje z tabeli docelowej | dane, pochodzenie, miejsce docelowe, według = „ID” | początek, miejsce docelowe, by = c(“ID”, “ID2”) |
| wewnętrzne_łączenie() | Połącz dwa zbiory danych. Wyklucza wszystkie niedopasowane wiersze | dane, pochodzenie, miejsce docelowe, według = „ID” | początek, miejsce docelowe, by = c(“ID”, “ID2”) |
| pełne_dołączenie() | Połącz dwa zbiory danych. Zachowuje wszystkie obserwacje | dane, pochodzenie, miejsce docelowe, według = „ID” | początek, miejsce docelowe, by = c(“ID”, “ID2”) |
Przeanalizujemy wszystkie typy złączeń na prostym przykładzie.
Na początek budujemy dwa zbiory danych. Tabela 1 zawiera dwie zmienne, ID i y, natomiast Tabela 2 gromadzi ID i z. W każdej sytuacji musimy mieć para kluczy zmienny. W naszym przypadku ID jest nasze klucz zmienny. Funkcja będzie szukać identycznych wartości w obu tabelach i powiąże zwracane wartości z prawej strony tabeli 1.
library(dplyr) df_primary <- tribble( ~ID, ~y, "A", 5, "B", 5, "C", 8, "D", 0, "F", 9) df_secondary <- tribble( ~ID, ~z, "A", 30, "B", 21, "C", 22, "D", 25, "E", 29)
Dplyr left_join()
Najpopularniejszym sposobem łączenia dwóch zbiorów danych jest użycie funkcji left_join(). Na poniższym obrazku widać, że para kluczy idealnie pasuje do wierszy A, B, C i D z obu zbiorów danych. Jednak E i F pozostają. Jak traktować te dwie obserwacje? Za pomocą funkcji left_join() zachowamy wszystkie zmienne w tabeli oryginalnej i nie będziemy brać pod uwagę zmiennych, które nie mają pary kluczy w tabeli docelowej. W naszym przykładzie zmienna E nie istnieje w tabeli 1. Dlatego wiersz zostanie usunięty. Zmienna F pochodzi z tabeli pochodzenia; zostanie zachowany po left_join() i zwróci NA w kolumnie z. Poniższy rysunek przedstawia, co się stanie z left_join().
Przykład dplyr left_join()
left_join(df_primary, df_secondary, by ='ID')
Wyjście:
## # A tibble: 5 x 3 ## ID y.x y.y ## <chr> <dbl> <dbl> ## 1 A 5 30 ## 2 B 5 21 ## 3 C 8 22 ## 4 D 0 25 ## 5 F 9 NA
Dplyr prawo_dołącz()
Funkcja Right_join() działa dokładnie tak samo jak left_join(). Jedyna różnica polega na tym, że wiersz został usunięty. Wartość E dostępna w docelowej ramce danych istnieje w nowej tabeli i przyjmuje wartość NA dla kolumny y.
Przykład dplyrright_join()
right_join(df_primary, df_secondary, by = 'ID')
Wyjście:
## # A tibble: 5 x 3 ## ID y.x y.y ## <chr> <dbl> <dbl> ## 1 A 5 30 ## 2 B 5 21 ## 3 C 8 22 ## 4 D 0 25 ## 5 E NA 29
Dplyr internal_join()
Kiedy mamy 100% pewności, że te dwa zbiory danych nie będą zgodne, możemy rozważyć powrót tylko wiersze istniejące w obie zbiór danych. Jest to możliwe, gdy potrzebujemy czystego zbioru danych lub gdy nie chcemy przypisywać brakujących wartości średniej lub medianie.
Z pomocą przychodzi funkcja internal_join(). Ta funkcja wyklucza niedopasowane wiersze.
Przykład dplyr internal_join()
inner_join(df_primary, df_secondary, by ='ID')
Wyjście:
## # A tibble: 4 x 3 ## ID y.x y.y ## <chr> <dbl> <dbl> ## 1 A 5 30 ## 2 B 5 21 ## 3 C 8 22 ## 4 D 0 25
Dplyr full_join()
Na koniec funkcja full_join() przechowuje wszystkie obserwacje i zastępuje brakujące wartości wartością NA.
Przykład dplyr full_join()
full_join(df_primary, df_secondary, by = 'ID')
Wyjście:
## # A tibble: 6 x 3 ## ID y.x y.y ## <chr> <dbl> <dbl> ## 1 A 5 30 ## 2 B 5 21 ## 3 C 8 22 ## 4 D 0 25 ## 5 F 9 NA ## 6 E NA 29
Wiele par kluczy
Na koniec, ale nie mniej ważne, możemy mieć wiele kluczy w naszym zestawie danych. Rozważmy następujący zestaw danych, w którym mamy lata lub listę produktów zakupionych przez klienta.
Jeśli spróbujemy połączyć obie tabele, R zgłosi błąd. Aby zaradzić tej sytuacji, możemy przekazać dwie pary kluczy. To znaczy ID i rok, które pojawiają się w obu zestawach danych. Możemy użyć następującego kodu, aby połączyć tabelę 1 i tabelę 2
df_primary <- tribble(
~ID, ~year, ~items,
"A", 2015,3,
"A", 2016,7,
"A", 2017,6,
"B", 2015,4,
"B", 2016,8,
"B", 2017,7,
"C", 2015,4,
"C", 2016,6,
"C", 2017,6)
df_secondary <- tribble(
~ID, ~year, ~prices,
"A", 2015,9,
"A", 2016,8,
"A", 2017,12,
"B", 2015,13,
"B", 2016,14,
"B", 2017,6,
"C", 2015,15,
"C", 2016,15,
"C", 2017,13)
left_join(df_primary, df_secondary, by = c('ID', 'year'))
Wyjście:
## # A tibble: 9 x 4 ## ID year items prices ## <chr> <dbl> <dbl> <dbl> ## 1 A 2015 3 9 ## 2 A 2016 7 8 ## 3 A 2017 6 12 ## 4 B 2015 4 13 ## 5 B 2016 8 14 ## 6 B 2017 7 6 ## 7 C 2015 4 15 ## 8 C 2016 6 15 ## 9 C 2017 6 13
Funkcje czyszczenia danych w R
Poniżej przedstawiono cztery ważne funkcje służące porządkowaniu (czyszczeniu) danych:
| Funkcjonować | Cel | Argumenty |
|---|---|---|
| zebrać() | Przekształć dane z szerokich na długie | (dane, klucz, wartość, na.rm = FALSE) |
| rozpowszechnianie się() | Przekształć dane z długich na szerokie | (dane, klucz, wartość) |
| oddzielny() | Podziel jedną zmienną na dwie | (dane, col, in, sep= „”, usuń = TRUE) |
| jednostka() | Połącz dwie zmienne w jedną | (dane, col, conc,sep= „”, usuń = TRUE) |
Korzystamy z biblioteki tidyr. Ta biblioteka należy do kolekcji bibliotek służących do manipulowania, czyszczenia i wizualizacji danych. Jeśli zainstalujemy R z anacondą, biblioteka jest już zainstalowana. Bibliotekę znajdziemy tutaj, https://anaconda.org/r/r-tidyr.
Jeśli jeszcze tego nie zrobiłeś, wprowadź poniższe polecenie, aby zainstalować tidyr:
install tidyr : install.packages("tidyr")
zebrać()
Celem funkcji gromadzenia() jest przekształcenie danych z szerokich na długie.
Składnia
gather(data, key, value, na.rm = FALSE) Arguments: -data: The data frame used to reshape the dataset -key: Name of the new column created -value: Select the columns used to fill the key column -na.rm: Remove missing values. FALSE by default
Przykład
Poniżej możemy zwizualizować koncepcję zmiany kształtu z szerokiego na długi. Chcemy utworzyć pojedynczą kolumnę o nazwie wzrost, wypełnioną wierszami zmiennych kwartału.
library(tidyr)
# Create a messy dataset
messy <- data.frame(
country = c("A", "B", "C"),
q1_2017 = c(0.03, 0.05, 0.01),
q2_2017 = c(0.05, 0.07, 0.02),
q3_2017 = c(0.04, 0.05, 0.01),
q4_2017 = c(0.03, 0.02, 0.04))
messy
Wyjście:
## country q1_2017 q2_2017 q3_2017 q4_2017 ## 1 A 0.03 0.05 0.04 0.03 ## 2 B 0.05 0.07 0.05 0.02 ## 3 C 0.01 0.02 0.01 0.04
# Reshape the data tidier <-messy %>% gather(quarter, growth, q1_2017:q4_2017) tidier
Wyjście:
## country quarter growth ## 1 A q1_2017 0.03 ## 2 B q1_2017 0.05 ## 3 C q1_2017 0.01 ## 4 A q2_2017 0.05 ## 5 B q2_2017 0.07 ## 6 C q2_2017 0.02 ## 7 A q3_2017 0.04 ## 8 B q3_2017 0.05 ## 9 C q3_2017 0.01 ## 10 A q4_2017 0.03 ## 11 B q4_2017 0.02 ## 12 C q4_2017 0.04
W funkcji zbierania() tworzymy dwie nowe zmienne kwartał i wzrost, ponieważ nasz oryginalny zbiór danych zawiera jedną zmienną grupową: tj. kraj i pary klucz-wartość.
rozpowszechnianie się()
Funkcja spread() działa odwrotnie niż zbieranie.
Składnia
spread(data, key, value) arguments: data: The data frame used to reshape the dataset key: Column to reshape long to wide value: Rows used to fill the new column
Przykład
Możemy zmienić kształt uporządkowanego zbioru danych z powrotem na niechlujny za pomocą funkcji spread()
# Reshape the data messy_1 <- tidier %>% spread(quarter, growth) messy_1
Wyjście:
## country q1_2017 q2_2017 q3_2017 q4_2017 ## 1 A 0.03 0.05 0.04 0.03 ## 2 B 0.05 0.07 0.05 0.02 ## 3 C 0.01 0.02 0.01 0.04
oddzielny()
Funkcja oddzielna() dzieli kolumnę na dwie części zgodnie z separatorem. Funkcja ta jest pomocna w niektórych sytuacjach, gdy zmienną jest data. Nasza analiza może wymagać skupienia się na miesiącu i roku, dlatego chcemy podzielić tę kolumnę na dwie nowe zmienne.
Składnia
separate(data, col, into, sep= "", remove = TRUE) arguments: -data: The data frame used to reshape the dataset -col: The column to split -into: The name of the new variables -sep: Indicates the symbol used that separates the variable, i.e.: "-", "_", "&" -remove: Remove the old column. By default sets to TRUE.
Przykład
Możemy oddzielić kwartał od roku w bardziej uporządkowanym zbiorze danych, stosując funkcję oddzielne().
separate_tidier <-tidier %>%
separate(quarter, c("Qrt", "year"), sep ="_")
head(separate_tidier)
Wyjście:
## country Qrt year growth ## 1 A q1 2017 0.03 ## 2 B q1 2017 0.05 ## 3 C q1 2017 0.01 ## 4 A q2 2017 0.05 ## 5 B q2 2017 0.07 ## 6 C q2 2017 0.02
zjednoczyć()
Funkcja unite() łączy dwie kolumny w jedną.
Składnia
unit(data, col, conc ,sep= "", remove = TRUE) arguments: -data: The data frame used to reshape the dataset -col: Name of the new column -conc: Name of the columns to concatenate -sep: Indicates the symbol used that unites the variable, i.e: "-", "_", "&" -remove: Remove the old columns. By default, sets to TRUE
Przykład
W powyższym przykładzie oddzieliliśmy kwartał od roku. Co jeśli chcemy je połączyć? Używamy następującego kodu:
unit_tidier <- separate_tidier %>% unite(Quarter, Qrt, year, sep ="_") head(unit_tidier)
Wyjście:
## country Quarter growth ## 1 A q1_2017 0.03 ## 2 B q1_2017 0.05 ## 3 C q1_2017 0.01 ## 4 A q2_2017 0.05 ## 5 B q2_2017 0.07 ## 6 C q2_2017 0.02
Podsumowanie
- Analiza danych można podzielić na trzy części: wyodrębnianie, przekształcanie i wizualizacja.
- R ma bibliotekę o nazwie dplyr, która pomaga w transformacji danych. Biblioteka dplyr składa się zasadniczo z czterech funkcji służących do manipulowania danymi i pięciu czasowników służących do czyszczenia danych.
- dplyr zapewnia przyjemny i wygodny sposób łączenia zestawów danych. Sprzężenie z dplyr dodaje zmienne na prawo od oryginalnego zbioru danych.
- Piękno dplyr polega na tym, że obsługuje cztery typy połączeń podobnych do SQL:
- left_join() – Aby połączyć dwa zbiory danych i zachować wszystkie obserwacje z tabeli początkowej.
- prawo_dołącz() – Aby połączyć dwa zbiory danych i zachować wszystkie obserwacje z tabeli docelowej.
- wewnętrzne_łączenie() – Aby połączyć dwa zestawy danych i wykluczyć wszystkie niedopasowane wiersze.
- pełne_dołączenie() – Aby połączyć dwa zbiory danych i zachować wszystkie obserwacje.
- Korzystając z biblioteki tidyr możesz przekształcić zbiór danych za pomocą następujących funkcji:
- zebrać(): Przekształca dane z szerokich na długie.
- rozpowszechnianie się(): Przekształca dane z długich na szerokie.
- oddzielny(): Podziel jedną zmienną na dwie.
- jednostka(): Połącz dwie zmienne w jedną.







