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.

  • 📋 Wybór kolumny: select(df, A, B) zachowuje nazwane kolumny, select(df, A:C) zachowuje zakres, a select(df, -C) usuwa zakres.
  • 🔎 Filtrowanie wierszy: filter(df, condition) zachowuje pasujące wiersze, a warunki łączą się ze znakiem ampersand dla AND lub pionową kreską dla OR.
  • 🔣 Sortowanie: arrange() domyślnie porządkuje wiersze rosnąco, a desc() odwraca kolejność wyświetlania każdej pojedynczej kolumny.
  • 🔗 Pipe Operasłup: Operator %>% przekazuje każdy wynik bezpośrednio do następnego czasownika, dzięki czemu żadne obiekty pośrednie nie zaśmiecają środowiska.
  • 🧹 Funkcje pomocnicze: starts_with(), contains() i where() wybierają kolumny według wzorca lub typu, a nie według nazwy.
  • 📐 Kolejność czasowników ma znaczenie: Użyj filtra wczesnego, aby zredukować ilość danych, a następnie wybierz je i uporządkuj, dzięki czemu każdy kolejny krok będzie tańszy.

R Wybierz filtr Uporządkuj potok

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

FAQ

Potok magrittr %>% jest dostarczany z dplyr i obsługuje składnię symboli zastępczych z kropką. Natywny potok |> pojawił się w R 4.1 i nie wymaga pakietu. Oba przekazują wynik z lewej strony do pierwszego argumentu z prawej strony.

Nie. Każdy czasownik dplyr zwraca nową ramkę danych i pozostawia dane wejściowe nienaruszone. Aby zmiana została zachowana, należy przypisać wynik do obiektu lub przekazać go dalej.

Porównanie z NA zwraca NA zamiast TRUE, a filter() zachowuje tylko wiersze z wartością TRUE. Użyj is.na(), aby celowo wybrać brakujące wartości, lub drop_na() z tidyr, aby je usunąć.

Inżynieria cech modeli sztucznej inteligencji polega głównie na filtrowaniu wierszy, wybieraniu kolumn i sortowaniu. dplyr przedstawia te kroki w postaci czytelnych potoków, które recenzenci mogą weryfikować, co ma znaczenie, gdy zestaw danych szkoleniowych musi być odtwarzalny.

Tak. Asystenci AI potrafią tłumaczyć podzbiór nawiasów na wywołania select() i filter() oraz objaśniać potok. Zawsze uruchamiaj obie wersje i porównuj wymiary, ponieważ base R i dplyr inaczej traktują wartości brakujące.

Podsumuj ten post następująco: