R Select(), Filter(), Arrange(), Pipeline met voorbeeld

⚡ Slimme samenvatting

Selecteren, filteren en rangschikken in R zijn de drie dplyr-functies waarmee je een dataframe kunt reduceren tot de kolommen, rijen en volgorde die je nodig hebt. In deze handleiding worden ze gecombineerd met de pipe-operator op een dataset met reistijden van 205 rijen.

  • 📋 Kolomselectie: select(df, A, B) behoudt benoemde kolommen, select(df, A:C) behoudt een bereik en select(df, -C) verwijdert er één.
  • 🔎 Rijfiltering: filter(df, condition) behoudt overeenkomende rijen, en voorwaarden worden gecombineerd met het ampersand-teken voor EN of de verticale streep voor OF.
  • 🔣 Sorteren: arrange() sorteert rijen standaard oplopend, en desc() keert de volgorde van afzonderlijke kolommen om.
  • 🔗 Pijptabak Operavoor: De operator %>% geeft elk resultaat direct door aan het volgende werkwoord, waardoor er geen tussenliggende objecten de omgeving onnodig complex maken.
  • 🧹 Hulpfuncties: starts_with(), contains() en where() selecteren kolommen op basis van patroon of type in plaats van op naam.
  • 📐 De volgorde van de werkwoorden is belangrijk: Filter de gegevens eerst om ze te verkleinen, selecteer ze vervolgens en sorteer ze daarna. Dit zorgt ervoor dat elke volgende stap goedkoper blijft.

R Selecteer Filter Rangschik pijplijn

Wat is dplyr in R?

dplyr is het datamanipulatiepakket van de tidyverse. Het vervangt de haakjesnotatie van base R met een kleine set werkwoorden, elk genoemd naar de actie die het uitvoert en elk met het dataframe als eerste argument. Die consistente structuur maakt het mogelijk om de werkwoorden aan elkaar te koppelen.

Werkwoord Werkt op Wat het doet
selecteer() columns Behoudt of verwijdert variabelen.
filter() Rijen Behoudt rijen die aan een bepaalde voorwaarde voldoen.
regelen() Rijen Herschikt rijen op basis van een of meer kolommen.
muteren() columns Maakt of wijzigt een variabele.
samenvatten() Hele tafel Voegt meerdere rijen samen tot één enkele statistiek.
groeperen op() Hele tafel De gegevens worden opgesplitst, zodat latere werkwoorden per groep worden uitgevoerd.

Deze handleiding behandelt de eerste drie werkwoorden plus de pipe. handleiding voor aggregatiefuncties behandelt group_by() en summarise() in detail.

Dataset gebruikt in deze handleiding

De bibliotheek dplyr bevat handige functies om door de dataset te navigeren. In deze tutorial gebruiken we de dataset 'Travel times'. Deze dataset registreert de ritten die een chauffeur maakt tussen zijn huis en werk. De dataset bevat veertien variabelen, waaronder:

  • DayOfWeek: Identificeer de dag van de week waarop de bestuurder zijn auto gebruikt
  • Afstand: De totale afstand van de reis
  • MaxSpeed: De maximale snelheid van de reis
  • TotalTime: De lengte in minuten van de reis

De dataset bevat 205 observaties, en de ritten vonden plaats vanaf Monday tot vrijdag.

Allereerst moet u:

  • laad de gegevensset
  • controleer de structuur van de gegevens.

Een handige dplyr-functie is glimpse(). Deze heeft dezelfde functie als de standaard R-functie str(), maar print één rij per variabele met het type en de eerste paar waarden, wat veel gemakkelijker te overzien is bij een grote dataset.

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

Output:

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

De variabele Comments verdient duidelijk een nadere blik: de eerste waarnemingen zijn allemaal leeg.

sum(df$Comments =="")

Code Uitleg

  • sum(df$Comments == “”): Telt de waarnemingen die gelijk zijn aan een lege tekenreeks in de kolom Comments van df

Output:

## [1] 181

Nadat de gegevens zijn geladen, begin je met de opdracht die de kolommen opsplitst.

selecteer()

We beginnen met het werkwoord select(). We hebben niet noodzakelijkerwijs alle variabelen nodig, en het is een goede gewoonte om alleen de variabelen te selecteren die u relevant vindt.

We hebben 181 ontbrekende waarnemingen, bijna 90 procent van de dataset. Als u besluit ze uit te sluiten, kunt u de analyse niet voortzetten.

De andere mogelijkheid is om de variabele Commentaar weg te laten met het select() werkwoord.

Met select() kunnen we variabelen op verschillende manieren selecteren. Houd er rekening mee dat het eerste argument de gegevensset is.

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

U kunt de derde manier gebruiken om de variabele Commentaar uit te sluiten.

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

Output:

## [1] 205  14
dim(step_1_df)

Output:

## [1] 205  13

De originele dataset heeft 14 features, terwijl de step_1_df er 13 heeft.

select() hulpfuncties in R

Het benoemen van elke kolom wordt onpraktisch zodra een dataset tientallen variabelen bevat. dplyr wordt geleverd met hulpmiddelen waarmee kolommen in plaats daarvan op patroon of op type kunnen worden geselecteerd.

Helper Selecteert kolommen die Voorbeeld
starts_with() Begin met een reeks select(df, starts_with(“Avg”))
eindigt met() Eindig met een tekenreeks select(df, ends_with(“Time”))
bevat() Bevat ergens een tekenreeks select(df, contains(“Speed”))
wedstrijden() Een reguliere expressie matchen select(df, matches(“^Max|^Avg”))
waar() Voldoen aan een typekeuring select(df, where(is.numeric))
alles() Nog geen naam bekend 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())

Twee andere werkwoorden passen van nature goed bij select(). Gebruik rename(new_name = old_name) om een ​​kolom te hernoemen zonder drop.ping de andere kolommen, en relocate() om kolommen te verplaatsen zonder ze allemaal op te sommen.

filter()

De functie filter() behoudt de waarnemingen die aan een bepaalde voorwaarde voldoen. filter() werkt precies hetzelfde als select(): je geeft eerst het dataframe door en vervolgens een voorwaarde, gescheiden door een komma.

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

Eén criterium

Allereerst kun je het aantal waarnemingen binnen elk niveau van een factorvariabele tellen.

table(step_1_df$GoingTo)

Code Uitleg

  • table(): Telt het aantal waarnemingen per niveau. Deze functie verwacht een factor- of tekenreeksvariabele.
  • tabel(step_1_df$GoingTo): Tel het aantal ritten naar elke bestemming

Output:

## 
##  GSK Home 
##  105  100	

De functietabel() geeft aan dat 105 ritten naar GSK gaan en 100 naar Thuis.

We kunnen de gegevens filteren om één dataset met 105 waarnemingen en een andere met 100 waarnemingen te retourneren.

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

Output:

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

Output:

## [1] 105  14

Meerdere criteria

We kunnen een dataset filteren met meer dan één criterium. Je kunt bijvoorbeeld...tract de observaties waarbij de bestemming Thuis was en de reis op een woensdag plaatsvond.

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

Output:

## [1] 23 14

23 waarnemingen voldeden aan dit criterium.

Algemene filter() voorwaarden en Operators in R

De functie filter() behoudt alle rijen waarvoor de voorwaarde waar is. Rijen die niet waar zijn (NA) worden verwijderd, een gedrag dat de meeste beginners verrast.

Operator Betekenis Voorbeeld
== Gelijk aan filter(df, GoingTo == “Home”)
!= Niet gelijk aan filter(df, DayOfWeek != “Monday")
& EN, beide moeten het volgende bezitten filter(df, Afstand > 50 & Maximale snelheid > 130)
| OF, beide kunnen de volgende eigenschappen bezitten filter(df, DayOfWeek == “Monday” | Dag van de week == “vrijdag”)
%in% Komt overeen met elke waarde in een vector. filter(df, DayOfWeek %in% c(“Monday", "Vrijdag"))
tussen() Valt binnen een numeriek bereik filter(df, between(Distance, 48, 52))
is.na() Is er sprake van een ontbrekende waarde? filter(df, is.na(FuelEconomy))

Drie gewoontes voorkomen de meeste filter()-fouten.

  • Gebruik %in% in plaats van gekoppelde OR. filter(df, DayOfWeek %in% c(“Monday”, “Friday”)) is korter en veel moeilijker verkeerd te typen dan twee == vergelijkingen die met een verticale streep zijn verbonden.
  • Test een ontbrekende waarde nooit met ==. De expressie x == NA retourneert NA, niet TRUE, waardoor de rij stilzwijgend wordt verwijderd. Gebruik in plaats daarvan is.na(x).
  • Komma's betekenen EN. filter(df, a, b) is identiek aan filter(df, a & b), daarom werkt het voorbeeld eerder in deze handleiding in beide gevallen.

De pijp Operator in dplyr

Voor het maken van een dataset zijn veel bewerkingen nodig, zoals:

  • importeren
  • samen te voegen
  • selecteren
  • filtering
  • enzovoort

De dplyr-bibliotheek wordt geleverd met een praktische operator, %>%, genaamd pijpHet maakt gegevensmanipulatie schoner, sneller en minder foutgevoelig.

Deze operator is een code die stappen uitvoert zonder tussenstappen op de harde schijf op te slaan. Als u terug bent bij ons voorbeeld van hierboven, kunt u de variabelen van interesse selecteren en filteren. We hebben drie stappen:

  • Stap 1: Gegevens importeren: Importeer de gps-gegevens
  • Stap 2: Gegevens selecteren: Selecteer GoingTo en DayOfWeek
  • Stap 3: Gegevens filteren: keer alleen terug naar Huis en Woensdag

We kunnen de moeilijke manier gebruiken om het te doen:

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

Output:

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

Dat is geen handige manier om veel bewerkingen aan elkaar te koppelen. Elk tussenresultaat blijft in de omgeving aanwezig en de namen verliezen al snel hun betekenis.

Gebruik in plaats daarvan de pipe-operator %>%. Je geeft het dataframe één keer een naam aan het begin en elke stap vloeit daaruit voort.

Basissyntaxis van pijplijn

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.

U kunt uw eerste pijp maken door de hierboven beschreven stappen te volgen.

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

Output:

## [1] TRUE

De twee objecten zijn identiek, dus de pipe leverde precies hetzelfde resultaat op in één leesbare verklaring.

regelen()

In de vorige zelfstudie, leer je hoe je de waarden sorteert met de functie sort(). De bibliotheek dplyr heeft zijn sorteerfunctie. Het werkt als een tierelier met de pijpleiding. Het werkwoord arrange() kan één of meerdere rijen opnieuw ordenen, oplopend (standaard) of aflopend.

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

We kunnen de afstand sorteren op bestemming.

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

Output:

##     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-werkwoorden in R: snel naslagwerk

De onderstaande tabel bevat een overzicht van alle werkwoorden die in deze handleiding worden gebruikt, met de syntaxis en wat elke aanroep retourneert:

Werkwoord Objectief Code Uitleg
glimp controleer de structuur van een df
glimpse(df)
Hetzelfde doel als str(), maar makkelijker te lezen.
selecteer() Selecteer/sluit de variabelen uit
select(df, A, B ,C)
Selecteer de variabelen A, B en C
select(df, A:C)
Selecteer alle variabelen van A tot C
select(df, -C)
Sluit C uit
filter() Behoud de rijen die aan een of meer voorwaarden voldoen.
filter(df, condition1)
Een voorwaarde
filter(df, condition1 & condition2)
Twee voorwaarden gecombineerd met EN
regelen() Sorteer de dataset met een of meer variabelen
arrange(A)
Oplopende soort variabele A
arrange(A, B)
Oplopend soort variabele A en B
arrange(desc(A), B)
Aflopend soort variabele A en oplopend soort B
%>% Creëer een pijplijn tussen elke stap
step 1 %>% step 2 %>% step 3

Veelgestelde vragen

De `magrittr %>%` pipe wordt meegeleverd met dplyr en ondersteunt placeholder-syntaxis met een punt. De native `|>` pipe is beschikbaar sinds R 4.1 en vereist geen pakket. Beide pipes geven het resultaat aan de linkerkant door aan het eerste argument aan de rechterkant.

Nee. Elke dplyr-aanroep retourneert een nieuw dataframe en laat de invoer ongewijzigd. Je moet het resultaat aan een object toewijzen of doorsturen via een pipe om de wijziging te behouden.

Een vergelijking met NA geeft NA terug in plaats van TRUE, en filter() behoudt alleen rijen die TRUE zijn. Gebruik is.na() om opzettelijk ontbrekende waarden te selecteren, of drop_na() van tidyr om ze te verwijderen.

Feature engineering voor AI-modellen bestaat voornamelijk uit het filteren van rijen, het selecteren van kolommen en het sorteren. dplyr zet deze stappen om in leesbare pipelines die reviewers kunnen controleren, wat belangrijk is wanneer een trainingsdataset reproduceerbaar moet zijn.

Ja. AI-assistenten kunnen het selecteren van subsets met haakjes vertalen naar select()- en filter()-aanroepen en de pipe uitleggen. Voer altijd beide versies uit en vergelijk de dimensies, omdat standaard R en dplyr ontbrekende waarden anders behandelen.

Vat dit bericht samen met: