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.
Proces analizy danych
Proces analizy danych

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.

Scal dane za pomocą R Dplyr

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

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

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

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

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.

Wiele par kluczy w R

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.

Przykład funkcji zbierania() w R

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ą.