R Select(), Filter(), Arrange(), Cjevovod s primjerom

⚡ Pametni sažetak

Odaberi, filtriraj i rasporedi u R-u su tri dplyr glagola koja reduciraju podatkovni okvir na stupce, retke i redoslijed koji vam je potreban. Ovaj vodič ih povezuje s operatorom cijevi na skupu podataka o vremenima putovanja od 205 redaka.

  • 📋 Odabir stupca: select(df, A, B) zadržava imenovane stupce, select(df, A:C) zadržava raspon, a select(df, -C) izostavlja jedan.
  • 🔎 Filtriranje redaka: filter(df, uvjet) čuva odgovarajuće retke, a uvjeti se kombiniraju s ampersandom za I ili okomitom crtom za ILI.
  • 🔣 Sortiranje: arrange() prema zadanim postavkama sortira retke uzlazno, a desc() obrće bilo koji pojedinačni stupac.
  • 🔗 Cijev Operator: Operator %>% svaki rezultat prosljeđuje izravno u sljedeći glagol, tako da nikakvi međuobjekti ne zatrpavaju okruženje.
  • 🧹 Pomoćne funkcije: starts_with(), contains() i where() odabiru stupce prema uzorku ili tipu umjesto prema imenu.
  • 📐 Redoslijed glagola je važan: Filtrirajte rano kako biste smanjili podatke, zatim odaberite, pa rasporedite, što svaki kasniji korak čini jeftinijim.

R Odaberi filtar Rasporedi cjevovod

Što je dplyr u R-u?

dplyr je paket za manipulaciju podacima tidyversea. Zamjenjuje notaciju baze u obliku zagrada R s malim skupom glagola, od kojih je svaki nazvan po radnji koju izvodi i svaki uzima podatkovni okvir kao svoj prvi argument. Taj dosljedan oblik omogućuje lančano povezivanje glagola.

Glagol Djeluje na Ono što se također
Odaberi() Kolumne Zadržava ili briše varijable
filtar() Redovi Održava retke koji odgovaraju uvjetu
organizirati () Redovi Preuredi retke za jedan ili više stupaca
mutirati() Kolumne Stvara ili mijenja varijablu
rezimirati() Cijeli stol Sažima više redaka u jednu statistiku
grupiraj_po() Cijeli stol Dijeli podatke tako da se kasniji glagoli izvršavaju po grupi

Ovaj vodič pokriva prva tri glagola plus okomitu crtu. tutorijal o agregatnim funkcijama Detaljno pokriva group_by() i summarize().

Skup podataka korišten u ovom vodiču

Biblioteka pod nazivom dplyr sadrži vrijedne glagole za navigaciju unutar skupa podataka. U ovom vodiču koristit ćete skup podataka o vremenima putovanja. Skup podataka bilježi putovanja koja vozač obavi između doma i radnog mjesta. U skupu podataka postoji četrnaest varijabli, uključujući:

  • DayOfWeek: Identificirajte dan u tjednu kada vozač koristi svoj automobil
  • Udaljenost: Ukupna udaljenost putovanja
  • MaxSpeed: Maksimalna brzina putovanja
  • Ukupno vrijeme: Duljina putovanja u minutama

Skup podataka sadrži 205 opažanja, a vožnje su se odvijale od Monday do petka.

Prije svega, trebate:

  • učitati skup podataka
  • provjeriti strukturu podataka.

Jedna praktična dplyr funkcija je glimpse(). Igra istu ulogu kao i str() u osnovnom R-u, ali ispisuje jedan redak po varijabli s tipom i prvih nekoliko vrijednosti, što je puno lakše skenirati na širokom skupu podataka.

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

Izlaz:

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

Varijabla Komentari očito treba bliže pogledati: prva opažanja su sva prazna.

sum(df$Comments =="")

Code Objašnjenje

  • sum(df$Comments == “”): Broji opažanja jednaka praznom nizu u stupcu Komentari od df

Izlaz:

## [1] 181

Nakon učitavanja podataka, počnite s glagolom koji skraćuje stupce.

Odaberi()

Počet ćemo s glagolom select(). Ne trebaju nam nužno sve varijable, a dobra je praksa odabrati samo one varijable koje smatrate relevantnima.

Nedostaje nam 181 promatranje, gotovo 90 posto skupa podataka. Ako ih odlučite isključiti, nećete moći nastaviti analizu.

Druga mogućnost je ispuštanje varijable Comment s glagolom select().

Varijable možemo odabrati na različite načine pomoću select(). Imajte na umu da je prvi argument skup podataka.

- `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žete koristiti treći način da isključite varijablu Comments.

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

Izlaz:

## [1] 205  14
dim(step_1_df)

Izlaz:

## [1] 205  13

Izvorni skup podataka ima 14 značajki dok step_1_df ima 13.

Pomoćne funkcije select() u R-u

Imenovanje svakog stupca postaje nepraktično kada skup podataka ima desetke varijabli. dplyr dolazi s pomoćnicima koji umjesto toga odabiru stupce prema uzorku ili prema vrsti.

Pomagač Odabire stupce koji Primjer
počinje_s() Započnite s nizom odaberi(df, počinje_s(“Prosjek”))
završava_s() Završite nizom odaberi(df, završava_s("Vrijeme"))
sadrži () Sadrži niz znakova bilo gdje odaberi(df, sadrži("Brzina"))
odgovara() Pronađi regularni izraz odaberi(df, podudaranja(“^Maks.|^Prosj.”))
gdje() Zadovoljiti tipski test odaberi(df, gdje(je.broj))
sve() Još nisu imenovani odaberi(df, UkupnoVrijeme, sve())
# 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())

Još dva glagola se prirodno sparuju s funkcijom select(). Koristite rename(new_name = old_name) za promjenu naziva stupca bez brisanja.ping ostale i relocate() za premještanje stupaca bez njihovog navođenja svih.

filtar()

Glagol filter() zadržava opažanja koja zadovoljavaju uvjet. filter() radi potpuno isto kao select(), prvo se prosljeđuje okvir podataka, a zatim uvjet odvojen zarezom:

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

Jedan kriterij

Prije svega, možete prebrojati broj opažanja unutar svake razine faktorske varijable.

table(step_1_df$GoingTo)

Code Objašnjenje

  • table(): Broji broj opažanja po razini. Očekuje faktor ili karakternu varijablu
  • table(step_1_df$GoingTo): Prebroji broj putovanja prema svakom odredištu

Izlaz:

## 
##  GSK Home 
##  105  100	

Funkcijska tablica() pokazuje da 105 vožnji ide do GSK-a, a 100 do kuće.

Možemo filtrirati podatke kako bismo vratili jedan skup podataka sa 105 opažanja i drugi sa 100 opažanja.

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

Izlaz:

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

Izlaz:

## [1] 105  14

Više kriterija

Skup podataka možemo filtrirati s više kriterija. Na primjer, možetetracopažanja gdje je odredište Dom, a putovanje se dogodilo u srijedu.

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

Izlaz:

## [1] 23 14

23 opažanja odgovaraju ovom kriteriju.

Uobičajeni uvjeti filtera() i Operatorovi u R

filter() zadržava svaki redak za koji se uvjet isplati kao TRUE. Redci koji se ispostave kao NA se odbacuju, što je ponašanje koje iznenađuje većinu početnika.

Operahumka Značenje Primjer
== Jednak filter(df, GoingTo == “Početna”)
!= Nije jednako filter(df, DanUTjednu != “Monday")
& I, oboje mora vrijediti filter(df, Udaljenost > 50 i Maks. Brzina > 130)
| ILI, bilo koji od njih može vrijediti filter(df, DanUTjednu == “Monday” | DanUTjednu == “Petak”)
%u% Odgovara bilo kojoj vrijednosti u vektoru filter(df, DanUTjednu %u% c("Monday", "Petak"))
između() Spada unutar numeričkog raspona filter(df, između(Udaljenost, 48, 52))
je.na() Nedostaje vrijednost filter(df, is.na(PotrošnjaGoriva))

Tri navike sprječavaju većinu filter() grešaka.

  • Koristite %in% umjesto lančanog ILI. filter(df, DanUTjednu %u% c("Monday", "Petak")) je kraće i puno ga je teže pogrešno napisati nego dvije usporedbe == spojene okomitom crtom.
  • Nikada ne provjeravajte nedostajuću vrijednost pomoću ==. Izraz x == NA vraća NA, a ne TRUE, pa se redak tiho odbacuje. Umjesto toga koristite is.na(x).
  • Zarezi znače I. filter(df, a, b) je identičan filter(df, a & b), zbog čega primjer ranije u ovom tutorijalu radi u oba slučaja.

Cijev Operator u dplyru

Stvaranje skupa podataka zahtijeva mnogo operacija, kao što su:

  • uvoza
  • stapanje
  • Odabirom
  • filtriranje
  • i tako dalje

Knjižnica dplyr dolazi s praktičnim operatorom, %>%, koji se zove the cijevČini manipulaciju podacima čišćom, bržom i manje sklonom pogreškama.

Ovaj operator je kod koji izvodi korake bez spremanja međukoraka na tvrdi disk. Ako se vratite na naš primjer odozgo, možete odabrati varijable od interesa i filtrirati ih. Imamo tri koraka:

  • Korak 1: Uvezite podatke: Uvezite GPS podatke
  • Korak 2: Odaberite podatke: Odaberite GoingTo i DayOfWeek
  • Korak 3: Filtrirajte podatke: Povratak samo kući i srijedom

Možemo koristiti teži način da to učinimo:

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

Izlaz:

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

To nije prikladan način lančanog povezivanja mnogih operacija. Svaki međurezultat ostaje u okruženju, a imena brzo prestaju značiti bilo što.

Umjesto toga koristite operator cijevi %>%. Okvir podataka imenujete jednom na početku i svaki korak teče od njega.

Osnovna sintaksa cjevovoda

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.

Svoju prvu cijev možete izraditi slijedeći gore navedene korake.

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

Izlaz:

## [1] TRUE

Dva objekta su identična, pa je cijev proizvela potpuno isti rezultat u jednoj čitljivoj izjavi.

organizirati ()

u prethodni vodičnaučit ćete kako sortirati vrijednosti pomoću funkcije sort(). Knjižnica dplyr ima svoju funkciju sortiranja. To radi kao šarm s cjevovodom. Glagol arrange() može promijeniti redoslijed jednog ili više redaka, bilo uzlazno (zadano) ili silazeći.

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

Udaljenost možemo sortirati prema odredištu.

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

Izlaz:

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

dplyr Glagoli u R-u: Kratki vodič

U donjoj tablici navedeni su svi glagoli korišteni u ovom vodiču, sa sintaksom i onim što svaki poziv vraća:

Glagol Cilj Code Objašnjenje
svjetlucanje provjerite strukturu df-a
glimpse(df)
Ista svrha kao str(), lakše za čitanje
Odaberi() Odaberite/isključite varijable
select(df, A, B ,C)
Odaberite varijable A, B i C
select(df, A:C)
Odaberite sve varijable od A do C
select(df, -C)
Isključi C
filtar() Neka retci odgovaraju jednom ili više uvjeta
filter(df, condition1)
Jedan uvjet
filter(df, condition1 & condition2)
Dva uvjeta kombinirana s I
organizirati () Razvrstajte skup podataka s jednom ili više varijabli
arrange(A)
Uzlazno sortiranje varijable A
arrange(A, B)
Uzlazno sortiranje varijabli A i B
arrange(desc(A), B)
Silazno sortiranje varijable A i rastuće sortiranje B
%>% Napravite cjevovod između svakog koraka
step 1 %>% step 2 %>% step 3

Pitanja i odgovori

Cjevovod magrittr %>% dolazi s dplyrom i podržava sintaksu rezerviranog mjesta s točkom. Izvorni |> cijevni sustav stigao je u R 4.1 i ne treba mu paket. Oba prosljeđuju lijevi rezultat u prvi argument s desne strane.

Ne. Svaki dplyr glagol vraća novi okvir podataka i ostavlja ulaz netaknutim. Rezultat morate dodijeliti objektu ili ga proslijediti dalje da bi promjena ostala važeća.

Usporedba s NA vraća NA umjesto TRUE, a filter() zadržava samo retke koji su TRUE. Koristite is.na() za namjeran odabir nedostajućih vrijednosti ili drop_na() iz tidyra za njihovo uklanjanje.

Inženjering značajki za AI modele uglavnom se sastoji od filtriranja redaka, odabira stupaca i sortiranja. dplyr izražava te korake kao čitljive cjevovode koje recenzenti mogu revidirati, što je važno kada skup podataka za obuku mora biti reproducibilan.

Da. AI asistenti mogu prevesti podskup zagrada u pozive select() i filter() te objasniti cijev. Uvijek pokrenite obje verzije i usporedite dimenzije, jer osnovni R i dplyr različito tretiraju nedostajuće vrijednosti.

Sažmite ovu objavu uz: