R Wybierz(), Filtruj(), Rozmieść(), Potok z przykładem
⚡ Inteligentne podsumowanie
Select, Filter i Arrange w R to trzy czasowniki dplyr, które redukują ramkę danych do kolumn, wierszy i odpowiedniej kolejności. Ten przewodnik łączy je z operatorem potoku w 205-wierszowym zestawie danych czasu podróży.
Czym jest dplyr w R?
dplyr to pakiet do manipulacji danymi Tidyverse. Zastępuje notację nawiasową w bazie R z małym zestawem czasowników, z których każdy ma nazwę pochodzącą od wykonywanej czynności i każdy przyjmuje ramkę danych jako pierwszy argument. Ten spójny kształt pozwala na łączenie czasowników w łańcuch.
| Czasownik | Działa na | Co to robi |
|---|---|---|
| Wybierz() | kolumny | Zachowuje lub usuwa zmienne |
| filtr() | Wydziwianie | Utrzymuje wiersze spełniające warunek |
| zorganizować() | Wydziwianie | Zmienia kolejność wierszy według jednej lub więcej kolumn |
| zmutować() | kolumny | Tworzy lub modyfikuje zmienną |
| streszczać() | Cała tabela | Zwija wiele wierszy do jednej statystyki |
| grupuj_według() | Cała tabela | Dzieli dane tak, aby późniejsze czasowniki były uruchamiane w grupach |
W tym samouczku omówione zostaną pierwsze trzy czasowniki oraz spółgłoska potoczna. samouczek dotyczący funkcji agregujących szczegółowo omawia group_by() i summarise().
Zestaw danych użyty w tym samouczku
Biblioteka dplyr zawiera cenne czasowniki do nawigacji w zbiorze danych. W tym samouczku wykorzystasz zbiór danych „Czas podróży”. Zbiór danych rejestruje podróże kierowcy między 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 205 obserwacji, a przejazdy odbywały się z Monday do piątku.
Przede wszystkim musisz:
- załaduj zbiór danych
- sprawdź strukturę danych.
Jedną z przydatnych funkcji dplyr jest glare(). Pełni ona tę samą rolę co str() z base R, ale wyświetla jeden wiersz dla każdej zmiennej z typem i pierwszymi kilkoma wartościami, co jest znacznie łatwiejsze do przeszukiwania w przypadku dużego zbioru danych.
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...
Zmienna Komentarze ewidentnie wymaga dokładniejszego przyjrzenia się: wszystkie pierwsze obserwacje są puste.
sum(df$Comments =="")
Code Wyjaśnienie
- sum(df$Comments == “”): Zlicz obserwacje równe pustemu ciągowi w kolumnie Komentarze w df
Wyjście:
## [1] 181
Po załadowaniu danych zacznij od polecenia przycinającego kolumny.
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.
Funkcje pomocnicze select() w R
Nadawanie nazw każdej kolumnie staje się niepraktyczne, gdy zbiór danych zawiera dziesiątki zmiennych. dplyr jest dostarczany z pomocnikami, które wybierają kolumny według wzorca lub typu.
| Pomocnik | Wybiera kolumny, które | Przykład |
|---|---|---|
| rozpoczyna się od() | Zacznij od ciągu znaków | wybierz(df, start_z(“Średnia”)) |
| kończy się z() | Zakończ sznurkiem | wybierz(df, kończy się(“Czas”)) |
| zawiera() | Zawiera ciąg znaków w dowolnym miejscu | wybierz(df, zawiera(“Prędkość”)) |
| mecze() | Dopasuj wyrażenie regularne | wybierz(df, pasuje(“^Max|^Avg”)) |
| Gdzie() | Spełnij test typu | wybierz(df, gdzie(jest.numeryczne)) |
| wszystko() | Nie zostały jeszcze nazwane | wybierz(df, TotalTime, wszystko()) |
# Keep only the timing columns df %>% select(ends_with("Time")) # Keep every numeric column df %>% select(where(is.numeric)) # Move TotalTime to the front, keep the rest in place df %>% select(TotalTime, everything())
Dwa kolejne czasowniki naturalnie łączą się z select(). Użyj rename(new_name = old_name), aby zmienić etykietę kolumny bez usuwania.ping pozostałe i relocate(), aby przenieść kolumny bez ich wszystkich list.
filtr()
Czasownik filter() zachowuje obserwacje spełniające warunek. Funkcja 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)
Code Wyjaśnienie
- table(): Zlicza liczbę obserwacji na poziomie. Oczekuje zmiennej czynnikowej lub znakowej.
- table(step_1_df$GoingTo): Policz liczbę podróży do każdego celu
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 where GoingTo == Home select_home <- filter(df, GoingTo == "Home") dim(select_home)
Wyjście:
## [1] 100 14
# Select observations where GoingTo == GSK (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. Na przykład, możesz np.tracw przypadku obserwacji, w których miejscem docelowym jest dom, a podróż miała 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.
Wspólne warunki filtra() i Operatory w R
Funkcja filter() zachowuje każdy wiersz, dla którego warunek ma wartość PRAWDA. Wiersze z wartością ND są pomijane, co jest zachowaniem zaskakującym dla większości początkujących.
| OperaTor | Znaczenie | Przykład |
|---|---|---|
| == | Równy | filtr(df, IdącDo == “Strona główna”) |
| != | Nie równa się | filtr(df, DzieńTygodnia != “Monday") |
| & | I oba muszą być utrzymane | filtr(df, Odległość > 50 i Maksymalna prędkość > 130) |
| | | LUB, oba mogą posiadać | filtr(df, DzieńTygodnia == “Monday” | Dzień Tygodnia == „Piątek”) |
| %W% | Dopasowuje dowolną wartość w wektorze | filtr(df, DzieńTygodnia %in% c(“Monday", "Piątek")) |
| pomiędzy() | Mieści się w zakresie liczbowym | filtr(df, pomiędzy(Odległość, 48, 52)) |
| jest.na() | Brakuje wartości | filtr(df, is.na(GospodarkaPaliwa)) |
Trzy nawyki zapobiegają większości błędów filter().
- Użyj %in% zamiast łańcucha OR. filtr(df, DzieńTygodnia %in% c(“Monday”, „Piątek”)) jest krótsze i o wiele trudniejsze do błędnego wpisania niż dwa porównania == połączone pionową kreską.
- Nigdy nie sprawdzaj brakującej wartości za pomocą ==. Wyrażenie x == NA zwraca NA, a nie TRUE, więc wiersz jest automatycznie usuwany. Zamiast tego użyj is.na(x).
- Przecinki oznaczają AND. filter(df, a, b) jest identyczne z filter(df, a & b), dlatego przykład podany wcześniej w tym samouczku działa w obie strony.
Rura Operator w dplyr
Utworzenie zbioru danych wymaga wykonania wielu operacji, takich jak:
- importowanie
- połączenie
- wybierając
- filtracja
- i tak dalej
Biblioteka dplyr zawiera praktyczny operator %>% zwany ruraDzięki temu manipulacja danymi staje się czystsza, szybsza 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 łączenia wielu operacji. Każdy wynik pośredni pozostaje w środowisku, a nazwy szybko przestają cokolwiek znaczyć.
Zamiast tego użyj operatora potoku %>%. Na początku nadajesz ramce danych nazwę raz, a każdy krok będzie od niej płynął.
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 a trailing `%>%`, because nothing follows it - Note: assigning the result to a new object is optional. Without it, the output prints 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
Oba obiekty są identyczne, więc potok wygenerował dokładnie ten sam wynik w jednym czytelnym poleceniu.
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
Czasowniki dplyr w R: szybki przewodnik
Poniższa tabela zawiera listę wszystkich czasowników użytych w tym samouczku, ich składnię i wyniki każdego wywołania:
| Czasownik | Cel | Code | Wyjaśnienie |
|---|---|---|---|
| dojrzeć | sprawdź strukturę df |
glimpse(df)
|
Ten sam cel co str(), łatwiejszy do odczytania |
| 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() | Zachowaj wiersze spełniające jeden lub więcej warunków |
filter(df, condition1)
|
Jeden warunek |
filter(df, condition1 & condition2)
|
Dwa warunki połączone AND | ||
| 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 |

