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.

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 |
