R Selectare(), Filtru (), Aranjare(), Pipeline cu Exemplu

⚡ Rezumat inteligent

Selectarea, Filtrarea și Aranjarea în R sunt cele trei verbe dplyr care reduc un cadru de date la coloanele, rândurile și ordinea de care aveți nevoie. Această demonstrație le înlănțuie cu operatorul pipe pe un set de date de 205 rânduri care prezintă timpii de parcurgere.

  • 📋 Selectarea coloanei: select(df, A, B) păstrează coloanele denumite, select(df, A:C) păstrează un interval, iar select(df, -C) elimină unul.
  • 🔎 Filtrarea rândurilor: filter(df, condition) păstrează rândurile corespondente, iar condițiile se combină cu semnul ampersand pentru AND sau cu bara verticală pentru OR.
  • 🔣 Triere: arrange() ordonează rândurile crescător în mod implicit, iar desc() inversează ordinea oricărei coloane.
  • 🔗 Pipe Operator: Operatorul %>% transmite fiecare rezultat direct verbului următor, astfel încât niciun obiect intermediar să nu aglomereze mediul.
  • 🧹 Funcții auxiliare: starts_with(), contains() și where() selectează coloanele după model sau tip în loc de după nume.
  • 📐 Ordinea verbelor contează: Filtrați din timp pentru a micșora datele, apoi selectați, apoi aranjați, ceea ce face ca fiecare pas ulterior să fie mai ieftin.

R Selectare Filtru Aranjare Conductă

Ce este dplyr în R?

dplyr este pachetul de manipulare a datelor din tidyverse. Înlocuiește notația între paranteze a bazei R cu un set mic de verbe, fiecare denumit după acțiunea pe care o efectuează și fiecare luând cadrul de date ca prim argument. Această formă consistentă este cea care permite înlănțuirea verbelor.

Verb Acționează asupra Ce face
Selectați() Coloane Păstrează sau elimină variabile
filtru() Rânduri Păstrează rândurile care corespund unei condiții
aranja() Rânduri Reordonează rândurile după una sau mai multe coloane
mutare() Coloane Creează sau modifică o variabilă
rezuma() Întregul tabel Restrânge mai multe rânduri într-o singură statistică
grupare_după() Întregul tabel Împarte datele astfel încât verbele ulterioare să fie executate pe grup

Acest tutorial acoperă primele trei verbe plus pipe-ul. tutorial pentru funcția agregată acoperă în detaliu group_by() și summarise().

Set de date utilizat în acest tutorial

Biblioteca numită dplyr conține verbe valoroase pentru navigarea în setul de date. În acest tutorial, veți utiliza setul de date Durata călătoriei. Setul de date înregistrează călătoriile pe care un șofer le face între casă și locul de muncă. Există paisprezece variabile în setul de date, inclusiv:

  • DayOfWeek: identificați ziua din săptămână în care șoferul își folosește mașina
  • Distanță: distanța totală a călătoriei
  • MaxSpeed: Viteza maximă a călătoriei
  • TotalTime: lungimea în minute a călătoriei

Setul de date conține 205 observații, iar călătoriile au avut loc de la Monday până vineri.

În primul rând, trebuie să:

  • încărcați setul de date
  • verifica structura datelor.

O funcție dplyr utilă este glimpse(). Aceasta joacă același rol ca și funcția de bază R str(), dar afișează câte un rând per variabilă cu tipul și primele câteva valori, ceea ce este mult mai ușor de analizat pe un set de date extins.

library(dplyr) 
PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/travel_times.csv"
df <- read.csv(PATH)
glimpse(df)

ieșire:

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

Variabila Comentarii necesită în mod clar o analiză mai atentă: primele observații sunt toate goale.

sum(df$Comments =="")

Code Explicație

  • sum(df$Comments == “”): Numără observațiile egale cu un șir gol în coloana Comentarii a df-ului

ieșire:

## [1] 181

Odată ce datele sunt încărcate, începeți cu verbul care elimină coloanele.

Selectați()

Vom începe cu verbul select(). Nu avem neapărat nevoie de toate variabilele, iar o bună practică este să selectați doar variabilele pe care le considerați relevante.

Avem 181 de observații lipsă, aproape 90 la sută din setul de date. Dacă decideți să le excludeți, nu veți putea continua analiza.

Cealaltă posibilitate este să renunți la variabila Comentariu cu verbul select().

Putem selecta variabile în moduri diferite cu select(). Rețineți că primul argument este setul de date.

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

Puteți utiliza a treia modalitate de a exclude variabila Comentarii.

step_1_df <- select(df, -Comments)
dim(df)

ieșire:

## [1] 205  14
dim(step_1_df)

ieșire:

## [1] 205  13

Setul de date original are 14 caracteristici, în timp ce step_1_df are 13.

Funcții Helper select() în R

Denumirea fiecărei coloane devine impracticabilă odată ce un set de date are zeci de variabile. dplyr este livrat cu instrumente auxiliare care selectează coloanele după model sau după tip.

Ajutor Selectează coloanele care Exemplu
începe_cu() Începeți cu un șir de caractere select(df, începe_cu(„Medie”))
se termină_cu() Se termină cu un șir de caractere select(df, se termină_cu(„Timp”))
conține() Conține un șir de caractere oriunde select(df, contains(“Viteză”))
chibrituri() Potriviți o expresie regulată select(df, matches(“^Max|^Avg”))
unde() Satisfaceți un test de tip select(df, where(is.numeric))
tot() Nu au fost încă numiți select(df, TotalTime, everything())
# 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())

Încă două verbe se împerechează natural cu select(). Folosește rename(new_name = old_name) pentru a redenumi o coloană fără a o elimina.ping celelalte și relocate() pentru a muta coloanele fără a le lista pe toate.

filtru()

Verbul filter() păstrează observațiile care îndeplinesc o condiție. filter() funcționează exact ca select(), se transmite mai întâi cadrul de date și apoi o condiție separată prin virgulă:

filter(df, condition)
arguments:
- df: dataset used to filter the data
- condition:  Condition used to filter the data	

Un singur criteriu

În primul rând, puteți număra numărul de observații din fiecare nivel al unei variabile factor.

table(step_1_df$GoingTo)

Code Explicație

  • table(): Numără observații pe nivel. Așteaptă o variabilă factor sau caracter
  • table(step_1_df$GoingTo): Numără numărul de călătorii către fiecare destinație

ieșire:

## 
##  GSK Home 
##  105  100	

Tabelul de funcții() indică 105 curse către GSK și 100 către Acasă.

Putem filtra datele pentru a returna un set de date cu 105 de observații și altul cu 100 de observații.

# Select observations where GoingTo == Home
select_home <- filter(df, GoingTo == "Home")
dim(select_home)

ieșire:

## [1] 100  14
# Select observations where GoingTo == GSK (work)
select_work <- filter(df, GoingTo == "GSK")
dim(select_work)

ieșire:

## [1] 105  14

Criterii multiple

Putem filtra un set de date cu mai multe criterii. De exemplu, puteți extracobservațiile în care destinația este Acasă, iar călătoria a avut loc miercuri.

select_home_wed <- filter(df, GoingTo == "Home" & DayOfWeek == "Wednesday")
dim(select_home_wed)

ieșire:

## [1] 23 14

23 de observații corespund acestui criteriu.

Condiții comune de filtrare () și Operatori în R

Funcția filter() păstrează fiecare rând pentru care condiția este evaluată ca TRUE. Rândurile care sunt evaluate ca NA sunt eliminate, acesta fiind comportamentul care îi surprinde pe majoritatea începătorilor.

OperaTdR Sens Exemplu
== Egal cu filtru(df, MergândLa == „Acasă”)
!= Nu este egal cu filtru(df, ZiuaSăptămânii != “Monday")
& ȘI, ambele trebuie să fie ținute filtru(df, Distanță > 50 și Viteză maximă > 130)
| SAU, oricare dintre acestea poate deține filtru(df, ZiuaSăptămânii == “Monday„ | ZiuaSăptămânii == „Vineri”)
%în% Potrivește orice valoare dintr-un vector filtru(df, ZiuaSăptămânii %în% c(“Monday„”, „vineri”))
între() Se încadrează într-un interval numeric filtru(df, între(Distanță, 48, 52))
is.na() Este o valoare lipsă filtru(df, is.na(EconomieCombustibil))

Trei obiceiuri previn majoritatea erorilor filter().

  • Folosește %in% în loc de SAU înlănțuit. filtru(df, ZiuaSăptămânii %în% c(“Monday„”, „vineri”) este mai scurt și mult mai greu de tastat greșit decât două == comparații unite printr-o bară verticală.
  • Nu testați niciodată o valoare lipsă cu ==. Expresia x == NA returnează NA, nu TRUE, deci rândul este șters în mod silențios. Se folosește în schimb is.na(x).
  • Virgulele înseamnă ȘI. filter(df, a, b) este identic cu filter(df, a & b), motiv pentru care exemplul anterior din acest tutorial funcționează în ambele sensuri.

Conducta Operator în dplyr

Crearea unui set de date necesită o mulțime de operațiuni, cum ar fi:

  • importatoare
  • care fuzionează
  • selectarea
  • filtrare
  • și așa mai departe

Biblioteca dplyr vine cu un operator practic, %>%, numit ţeavăFace manipularea datelor mai curată, mai rapidă și mai puțin predispusă la erori.

Acest operator este un cod care efectuează pași fără a salva pașii intermediari pe hard disk. Dacă reveniți la exemplul nostru de mai sus, puteți selecta variabilele de interes și le puteți filtra. Avem trei pași:

  • Pasul 1: importați date: importați datele GPS
  • Pasul 2: Selectați datele: selectați GoingTo și DayOfWeek
  • Pasul 3: Filtrați datele: Reveniți numai acasă și miercuri

Putem folosi modul greu de a face acest lucru:

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

ieșire:

##   GoingTo DayOfWeek
## 1    Home Wednesday
## 2    Home Wednesday
## 3    Home Wednesday
## 4    Home Wednesday
## 5    Home Wednesday
## 6    Home Wednesday	

Aceasta nu este o modalitate convenabilă de a înlănțui mai multe operații. Fiecare rezultat intermediar rămâne în mediu, iar numele își pierd rapid orice semnificație.

Folosește în schimb operatorul de tip pipe %>%. Denumești cadrul de date o singură dată la început și fiecare pas pornește de la acesta.

Sintaxa de bază a conductei

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.

Puteți crea prima conductă urmând pașii enumerați mai sus.

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

ieșire:

## [1] TRUE

Cele două obiecte sunt identice, așadar pipe-ul a produs exact același rezultat într-o singură instrucțiune lizibilă.

aranja()

În tutorialul anterior, înveți cum să sortezi valorile cu funcția sort(). Biblioteca dplyr are funcția de sortare. Funcționează ca un farmec cu conducta. Verbul arrange() poate reordona unul sau mai multe rânduri, fie crescător (implicit), fie descrescător.

- `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

Putem sorta distanța după destinație.

# Sort by destination and distance
step_2_df <- step_1_df %>%
    arrange(GoingTo, Distance)
head(step_2_df)

ieșire:

##     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

Verbe dplyr în R: Referință rapidă

Tabelul de mai jos listează fiecare verb folosit în acest tutorial, împreună cu sintaxa și ce returnează fiecare apel:

Verb Obiectiv Code Explicație
licărire verifica structura unui df
glimpse(df)
Același scop ca și str(), mai ușor de citit
Selectați() Selectați/excludeți variabilele
select(df, A, B ,C)
Selectați variabilele A, B și C
select(df, A:C)
Selectați toate variabilele de la A la C
select(df, -C)
Excludeți C
filtru() Păstrați rândurile care corespund uneia sau mai multor condiții
filter(df, condition1)
O condiție
filter(df, condition1 & condition2)
Două condiții combinate cu ȘI
aranja() Sortați setul de date cu una sau mai multe variabile
arrange(A)
Sort crescător de variabilă A
arrange(A, B)
Sort crescător de variabile A și B
arrange(desc(A), B)
Variabila descendentă A și ascendentă B
%>% Creați o conductă între fiecare pas
step 1 %>% step 2 %>% step 3

Întrebări frecvente

Pipe-ul magrittr %>% este livrat cu dplyr și acceptă sintaxa de substituție cu punct. Pipe-ul nativ |> a apărut în R 4.1 și nu necesită niciun pachet. Ambele transmit rezultatul din stânga în primul argument din dreapta.

Nu. Fiecare verb dplyr returnează un nou cadru de date și lasă intrarea neschimbată. Trebuie să atribuiți rezultatul unui obiect sau să îl transmiteți mai departe pentru ca modificarea să persiste.

O comparație cu NA returnează NA în loc de TRUE, iar filter() păstrează doar rândurile care sunt TRUE. Folosește is.na() pentru a selecta în mod deliberat valorile lipsă sau drop_na() din tidyr pentru a le elimina.

Ingineria caracteristicilor pentru modelele de inteligență artificială constă în principal în filtrarea rândurilor, selectarea coloanelor și sortarea. dplyr exprimă acești pași sub formă de conducte lizibile pe care recenzorii le pot audita, ceea ce este important atunci când un set de date de antrenament trebuie să fie reproductibil.

Da. Asistenții inteligenți artificiali pot traduce subseturile de paranteze în apeluri select() și filter() și pot explica funcționarea pipe-ului. Rulați întotdeauna ambele versiuni și comparați dimensiunile, deoarece R de bază și dplyr tratează valorile lipsă diferit.

Rezumați această postare cu: