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