R Wybierz(), Filtruj(), Rozmieść(), Potok z przykładem
Biblioteka o nazwie dplyr zawiera cenne czasowniki umożliwiające poruszanie się po zbiorze danych. W tym samouczku będziesz korzystać ze zbioru danych Czasy podróży. Zbiór danych gromadzi informacje o trasach przejazdu kierowcy pomiędzy jego domem a miejscem pracy. W zbiorze danych znajduje się czternaście zmiennych, w tym:
- DayOfWeek: Określ dzień tygodnia, w którym kierowca korzysta ze swojego samochodu
- Dystans: Całkowity dystans podróży
- MaxSpeed: Maksymalna prędkość podróży
- TotalTime: Długość podróży w minutach
Zbiór danych zawiera około 200 obserwacji, a przejażdżki miały miejsce pomiędzy nimi Monday do piątku.
Przede wszystkim musisz:
- załaduj zbiór danych
- sprawdź strukturę danych.
Przydatną funkcją dplyr jest funkcja przebłysk(). Jest to ulepszenie w stosunku do str(). Możemy użyć funkcji błyskotliwej(), aby zobaczyć strukturę zbioru danych i zdecydować, jakie manipulacje są wymagane.
library(dplyr) PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/travel_times.csv" df <- read.csv(PATH) glimpse(df)
Wyjście:
## Observations: 205 ## Variables: 14 ## $ X <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ... ## $ Date <fctr> 1/6/2012, 1/6/2012, 1/4/2012, 1/4/2012, 1/3/20... ## $ StartTime <fctr> 16:37, 08:20, 16:17, 07:53, 18:57, 07:57, 17:3... ## $ DayOfWeek <fctr> Friday, Friday, Wednesday, Wednesday, Tuesday,... ## $ GoingTo <fctr> Home, GSK, Home, GSK, Home, GSK, Home, GSK, GS... ## $ Distance <dbl> 51.29, 51.63, 51.27, 49.17, 51.15, 51.80, 51.37... ## $ MaxSpeed <dbl> 127.4, 130.3, 127.4, 132.3, 136.2, 135.8, 123.2... ## $ AvgSpeed <dbl> 78.3, 81.8, 82.0, 74.2, 83.4, 84.5, 82.9, 77.5,... ## $ AvgMovingSpeed <dbl> 84.8, 88.9, 85.8, 82.9, 88.1, 88.8, 87.3, 85.9,... ## $ FuelEconomy <fctr> , , , , , , -, -, 8.89, 8.89, 8.89, 8.89, 8.89... ## $ TotalTime <dbl> 39.3, 37.9, 37.5, 39.8, 36.8, 36.8, 37.2, 37.9,... ## $ MovingTime <dbl> 36.3, 34.9, 35.9, 35.6, 34.8, 35.0, 35.3, 34.3,... ## $ Take407All <fctr> No, No, No, No, No, No, No, No, No, No, No, No... ## $ Comments <fctr> , , , , , , , , , , , , , , , Put snow tires o...
Jest oczywiste, że zmienna Komentarze wymaga dalszej diagnostyki. Pierwsze obserwacje zmiennej Komentarze zawierają jedynie brakujące wartości.
sum(df$Comments =="")
Objaśnienie kodu
- sum(df$Comments ==””): Zsumuj obserwacje równe „” w kolumnie komentarzy z df
Wyjście:
## [1] 181
Wybierz()
Zaczniemy od czasownika wybierz(). Niekoniecznie potrzebujemy wszystkich zmiennych, a dobrą praktyką jest wybieranie tylko tych zmiennych, które uznasz za istotne.
Mamy 181 brakujących obserwacji, co stanowi prawie 90 procent zbioru danych. Jeśli zdecydujesz się je wykluczyć, nie będziesz mógł kontynuować analizy.
Inną możliwością jest usunięcie zmiennej Comment za pomocą czasownika Select().
Za pomocą funkcji Select() możemy wybierać zmienne na różne sposoby. Należy pamiętać, że pierwszym argumentem jest zbiór danych.
- `select(df, A, B ,C)`: Select the variables A, B and C from df dataset. - `select(df, A:C)`: Select all variables from A to C from df dataset. - `select(df, -C)`: Exclude C from the dataset from df dataset.
Możesz użyć trzeciego sposobu, aby wykluczyć zmienną Komentarze.
step_1_df <- select(df, -Comments) dim(df)
Wyjście:
## [1] 205 14
dim(step_1_df)
Wyjście:
## [1] 205 13
Oryginalny zbiór danych ma 14 funkcji, podczas gdy step_1_df ma 13.
Filtr()
Czasownik filter() pomaga zachować obserwacje zgodne z kryteriami. Filter() działa dokładnie tak samo jak select(), najpierw przekazujesz ramkę danych, a następnie warunek oddzielony przecinkiem:
filter(df, condition) arguments: - df: dataset used to filter the data - condition: Condition used to filter the data
Jedno kryterium
Po pierwsze, możesz policzyć liczbę obserwacji na każdym poziomie zmiennej czynnikowej.
table(step_1_df$GoingTo)
Objaśnienie kodu
- table(): Policz liczbę obserwacji według poziomu. Uwaga, akceptowane są tylko zmienne na poziomie czynnika
- table(step_1_df$GoingTo): Zlicz liczbę podróży do miejsca docelowego.
Wyjście:
## ## GSK Home ## 105 100
Funkcja table() wskazuje, że 105 przejazdów uda się do GSK, a 100 do domu.
Możemy filtrować dane, aby zwrócić jeden zbiór danych zawierający 105 obserwacji, a drugi ze 100 obserwacjami.
# Select observations if GoingTo == Home select_home <- filter(df, GoingTo == "Home") dim(select_home)
Wyjście:
## [1] 100 14
# Select observations if GoingTo == Work select_work <- filter(df, GoingTo == "GSK") dim(select_work)
Wyjście:
## [1] 105 14
Wiele kryteriów
Możemy filtrować zbiór danych według więcej niż jednego kryterium. Można na przykład wyodrębnić obserwacje, których celem jest Dom i który miał miejsce w środę.
select_home_wed <- filter(df, GoingTo == "Home" & DayOfWeek == "Wednesday") dim(select_home_wed)
Wyjście:
## [1] 23 14
Kryterium to spełniały 23 obserwacje.
Rurociąg
Utworzenie zbioru danych wymaga wykonania wielu operacji, takich jak:
- importowanie
- połączenie
- wybierając
- filtracja
- i tak dalej
Biblioteka dplyr zawiera praktyczny operator %>% zwany rurociąg. Funkcja potoku sprawia, że manipulacja jest czysta, szybka i mniej podatna na błędy.
Ten operator to kod, który wykonuje kroki bez zapisywania kroków pośrednich na dysku twardym. Jeśli wrócisz do naszego przykładu powyżej, możesz wybrać interesujące zmienne i je przefiltrować. Mamy trzy kroki:
- Krok 1: Importuj dane: Zaimportuj dane GPS
- Krok 2: Wybierz dane: Wybierz GoingTo i DayOfWeek
- Krok 3: Filtruj dane: Wróć tylko do domu i w środę
Możemy to zrobić w trudny sposób:
# Step 1 step_1 <- read.csv(PATH) # Step 2 step_2 <- select(step_1, GoingTo, DayOfWeek) # Step 3 step_3 <- filter(step_2, GoingTo == "Home", DayOfWeek == "Wednesday") head(step_3)
Wyjście:
## GoingTo DayOfWeek ## 1 Home Wednesday ## 2 Home Wednesday ## 3 Home Wednesday ## 4 Home Wednesday ## 5 Home Wednesday ## 6 Home Wednesday
To nie jest wygodny sposób wykonywania wielu operacji, szczególnie w sytuacji z wieloma krokami. Środowisko kończy się z wieloma przechowywanymi obiektami.
Zamiast tego użyjmy operatora potoku %>%. Musimy tylko zdefiniować ramkę danych używaną na początku, a cały proces będzie płynął z niej.
Podstawowa składnia potoku
New_df <- df %>% step 1 %>% step 2 %>% ... arguments - New_df: Name of the new data frame - df: Data frame used to compute the step - step: Instruction for each step - Note: The last instruction does not need the pipe operator `%`, you don't have instructions to pipe anymore Note: Create a new variable is optional. If not included, the output will be displayed in the console.
Możesz utworzyć swoją pierwszą rurę wykonując kroki wymienione powyżej.
# Create the data frame filter_home_wed.It will be the object return at the end of the pipeline filter_home_wed <- #Step 1 read.csv(PATH) % > % #Step 2 select(GoingTo, DayOfWeek) % > % #Step 3 filter(GoingTo == "Home",DayOfWeek == "Wednesday") identical(step_3, filter_home_wed)
Wyjście:
## [1] TRUE
Jesteśmy gotowi stworzyć niesamowity zbiór danych za pomocą operatora potoku.
zorganizować()
W poprzedni samouczek, dowiesz się, jak sortować wartości za pomocą funkcji sort(). Biblioteka dplyr ma funkcję sortowania. Działa jak urok z rurociągiem. Czasownik zorganizować() może zmienić kolejność jednego lub wielu wierszy, rosnąco (domyślnie) lub malejąco.
- `arrange(A)`: Ascending sort of variable A - `arrange(A, B)`: Ascending sort of variable A and B - `arrange(desc(A), B)`: Descending sort of variable A and ascending sort of B
Możemy sortować odległość według miejsca docelowego.
# Sort by destination and distance step_2_df <-step_1_df %>% arrange(GoingTo, Distance) head<step_2_df)
Wyjście:
## X Date StartTime DayOfWeek GoingTo Distance MaxSpeed AvgSpeed ## 1 193 7/25/2011 08:06 Monday GSK 48.32 121.2 63.4 ## 2 196 7/21/2011 07:59 Thursday GSK 48.35 129.3 81.5 ## 3 198 7/20/2011 08:24 Wednesday GSK 48.50 125.8 75.7 ## 4 189 7/27/2011 08:15 Wednesday GSK 48.82 124.5 70.4 ## 5 95 10/11/2011 08:25 Tuesday GSK 48.94 130.8 85.7 ## 6 171 8/10/2011 08:13 Wednesday GSK 48.98 124.8 72.8 ## AvgMovingSpeed FuelEconomy TotalTime MovingTime Take407All ## 1 78.4 8.45 45.7 37.0 No ## 2 89.0 8.28 35.6 32.6 Yes ## 3 87.3 7.89 38.5 33.3 Yes ## 4 77.8 8.45 41.6 37.6 No ## 5 93.2 7.81 34.3 31.5 Yes ## 6 78.8 8.54 40.4 37.3 No
Podsumowanie
W poniższej tabeli podsumowujesz wszystkie operacje, których nauczyłeś się w trakcie kursu.
Czasownik | Cel | Code | Wyjaśnienie |
---|---|---|---|
dojrzeć | sprawdź strukturę df |
glimpse(df) |
Identyczny z str() |
Wybierz() | Wybierz/wyklucz zmienne |
select(df, A, B ,C) |
Wybierz zmienne A, B i C |
select(df, A:C) |
Wybierz wszystkie zmienne od A do C | ||
select(df, -C) |
Wyklucz C | ||
filtr() | Filtruj df na podstawie jednego lub wielu warunków |
filter(df, condition1) |
Jeden warunek |
filter(df, condition1 |
warunek2) | ||
zorganizować() | Sortuj zbiór danych za pomocą jednej lub wielu zmiennych |
arrange(A) |
Rosnąca zmienna A |
arrange(A, B) |
Rosnąco sortowanie zmiennej A i B | ||
arrange(desc(A), B) |
Sortowanie malejące zmiennej A i sortowanie rosnące B | ||
%>% | Utwórz potok pomiędzy każdym krokiem |
step 1 %>% step 2 %>% step 3 |