R Vælg(), Filter(), Arranger(), Pipeline med eksempel

⚡ Smart opsummering

"Select", "Filter" og "Arrange" i R er de tre "dplyr"-verber, der reducerer en dataramme til de kolonner, rækker og den rækkefølge, du har brug for. Denne gennemgang kæder dem sammen med pipe-operatoren på et datasæt med 205 rækkers rejsetid.

  • ???? Kolonnevalg: select(df, A, B) beholder navngivne kolonner, select(df, A:C) beholder et område, og select(df, -C) fjerner én.
  • 🔎 Rækkefiltrering: filter(df, condition) bevarer matchende rækker, og betingelser kombineres med og-tegnet for AND eller den lodrette bjælke for OR.
  • 🔣 Sortering: arrange() sorterer rækker stigende som standard, og desc() vender enhver enkelt kolonne om.
  • 🔗 Rør Operator: Operatoren %>% sender hvert resultat direkte til det næste verbum, så ingen mellemliggende objekter roder i miljøet.
  • 🧹 Hjælpefunktioner: `starts_with(), `contains()` og `where()` vælger kolonner efter mønster eller type i stedet for efter navn.
  • 📐 Verberækkefølgen har betydning: Filtrer tidligt for at krympe dataene, vælg derefter, og arranger derefter, hvilket holder hvert senere trin billigere.

R Vælg Filter Arranger Pipeline

Hvad er dplyr i R?

dplyr er datamanipulationspakken til tidyverse. Den erstatter parentesnotationen for basis R med et lille sæt verber, der hver især er opkaldt efter den handling, den udfører, og som hver især tager datarammen som sit første argument. Det er denne ensartede form, der gør det muligt at kæde verberne sammen.

Udsagnsord Handler på Hvad gør den
Vælg() Kolonner Beholder eller fjerner variabler
filter() Rækker Holder rækker, der matcher en betingelse
arrangere() Rækker Omarrangerer rækker efter en eller flere kolonner
mutere() Kolonner Opretter eller ændrer en variabel
sammenfatte() Hele bordet Skjulerer mange rækker til en enkelt statistik
group_by() Hele bordet Opdeler dataene, så senere verber kører per gruppe

Denne vejledning dækker de første tre verber plus pipen. vejledning til aggregatfunktioner dækker group_by() og summary() i dybden.

Datasæt brugt i denne vejledning

Biblioteket kaldet dplyr indeholder værdifulde verber til at navigere i datasættet. I denne vejledning vil du bruge datasættet Rejsetider. Datasættet registrerer de ture, en chauffør foretager mellem hjem og arbejdsplads. Der er fjorten variabler i datasættet, herunder:

  • DayOfWeek: Identificer den ugedag chaufføren bruger sin bil
  • Distance: Rejsens samlede distance
  • MaxSpeed: Rejsens maksimale hastighed
  • TotalTime: Rejsens længde i minutter

Datasættet indeholder 205 observationer, og turene fandt sted fra Monday til fredag.

Først og fremmest skal du:

  • indlæse datasættet
  • kontrollere strukturen af ​​dataene.

En praktisk dplyr-funktion er glimpe(). Den spiller samme rolle som base R str(), men udskriver én række pr. variabel med typen og de første par værdier, hvilket er langt nemmere at scanne på et bredt datasæt.

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

Kommentarvariablen trænger helt klart til et nærmere kig: de første observationer er alle tomme.

sum(df$Comments =="")

Code Forklaring

  • sum(df$Comments == “”): Tæl observationerne lig med en tom streng i kommentarkolonnen i df

Output:

## [1] 181

Når dataene er indlæst, skal du starte med det verbum, der beskærer kolonnerne.

Vælg()

Vi begynder med udsagnsordet select(). Vi har ikke nødvendigvis brug for alle variablerne, og en god praksis er kun at vælge de variabler, du finder relevante.

Vi har 181 manglende observationer, næsten 90 procent af datasættet. Hvis du beslutter dig for at udelukke dem, vil du ikke være i stand til at fortsætte analysen.

Den anden mulighed er at droppe variablen Comment med udsagnsordet select().

Vi kan vælge variable på forskellige måder med select(). Bemærk, at det første argument er datasættet.

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

Du kan bruge den tredje måde til at udelukke variablen Kommentarer.

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

Output:

## [1] 205  14
dim(step_1_df)

Output:

## [1] 205  13

Det originale datasæt har 14 funktioner, mens step_1_df har 13.

select() Hjælpefunktioner i R

Det bliver upraktisk at navngive hver kolonne, når et datasæt har snesevis af variabler. dplyr leveres med hjælpere, der i stedet vælger kolonner efter mønster eller type.

Hjælper Vælger kolonner, der Eksempel
starter_med() Start med en streng vælg(df, starter_med("Gennemsnit"))
slutter_med() Slut med en streng vælg(df, slutter_med("Tid"))
indeholder() Indeholder en streng et hvilket som helst sted select(df, contains("Hastighed"))
Tændstikker() Match et regulært udtryk select(df, matches("^Maks|^Gennemsnit"))
hvor() Bestå en typetest select(df, hvor(is.numeric))
alt() Er ikke blevet navngivet endnu select(df, TotalTid, 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())

To andre verber parrer sig naturligt med select(). Brug rename(new_name = old_name) til at omnavngive en kolonne uden at slette den.ping de andre, og relocate() for at flytte kolonner uden at liste dem alle.

filter()

Verbet filter() gemmer de observationer, der opfylder en betingelse. Filter() fungerer præcis som select(), du sender først datarammen og derefter en betingelse adskilt af et komma:

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

Et kriterium

Først og fremmest kan du tælle antallet af observationer inden for hvert niveau af en faktorvariabel.

table(step_1_df$GoingTo)

Code Forklaring

  • tabel(): Tæl antallet af observationer pr. niveau. Den forventer en faktor eller tegnvariabel
  • tabel(step_1_df$GoingTo): Tæl antallet af ture til hver destination

Output:

## 
##  GSK Home 
##  105  100	

Funktionstabellen() angiver, at 105 ture går til GSK og 100 til Home.

Vi kan filtrere dataene for at returnere et datasæt med 105 observationer og et andet med 100 observationer.

# 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

Flere kriterier

Vi kan filtrere et datasæt med mere end ét kriterium. For eksempel kan du f.eks.tracobservationerne, hvor destinationen er Hjem, og rejsen fandt sted om onsdagen.

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

Output:

## [1] 23 14

23 observationer matchede dette kriterium.

Fælles filter() betingelser og Operators i R

filter() gemmer alle rækker, hvor betingelsen evalueres til TRUE. Rækker, der evalueres til NA, udelades, hvilket er den adfærd, der overrasker de fleste begyndere.

OperaTor Betydning Eksempel
== Svarende til filter(df, SkalTil == “Hjem”)
!= Ikke lig med filter(df, Ugedag != “Monday")
& OG begge skal holde filter(df, Afstand > 50 & Maks. Hastighed > 130)
| ELLER, begge kan holde filter(df, Ugedag == “Monday" | Ugedag == "Fredag")
%i% Matcher enhver værdi i en vektor filter(df, Ugedag %i% c("Monday", "fredag"))
mellem() Falder inden for et numerisk område filter(df, mellem(Afstand, 48, 52))
is.na() Er en manglende værdi filter(df, is.na(Brændstoføkonomi))

Tre vaner forhindrer de fleste filter()-fejl.

  • Brug %in% i stedet for kædet ELLER. filter(df, Ugedag %i% c("Monday", "fredag")) er kortere og langt sværere at skrive forkert end to ==-sammenligninger forbundet af en lodret streg.
  • Test aldrig en manglende værdi med ==. Udtrykket x == NA returnerer NA, ikke TRUE, så rækken slettes lydløst. Brug is.na(x) i stedet.
  • Kommaer betyder OG. filter(df, a, b) er identisk med filter(df, a & b), hvilket er grunden til, at eksemplet tidligere i denne vejledning fungerer på begge måder.

Piben Operator i dplyr

Oprettelse af et datasæt kræver en masse operationer, såsom:

  • importere
  • sammenlægning
  • udvælgelse
  • filtrering
  • og så videre

dplyr-biblioteket leveres med en praktisk operatør, %>%, kaldet rørDet gør datamanipulation renere, hurtigere og mindre udsat for fejl.

Denne operatør er en kode, der udfører trin uden at gemme mellemtrin på harddisken. Hvis du er tilbage til vores eksempel fra oven, kan du vælge variablerne af interesse og filtrere dem. Vi har tre trin:

  • Trin 1: Importer data: Importer gps-dataene
  • Trin 2: Vælg data: Vælg GoingTo og DayOfWeek
  • Trin 3: Filtrer data: Retur kun hjem og onsdag

Vi kan bruge den hårde måde at gøre det på:

# 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	

Det er ikke en bekvem måde at kæde mange operationer sammen på. Hvert mellemresultat forbliver i miljøet, og navnene holder hurtigt op med at betyde noget.

Brug i stedet pipe-operatoren %>%. Du navngiver datarammen én gang i starten, og hvert trin følger derfra.

Grundlæggende syntaks for pipeline

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.

Du kan oprette din første pipe ved at følge de trin, der er opregnet ovenfor.

# 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 to objekter er identiske, så pipen producerede præcis det samme resultat i en enkelt læsbar sætning.

arrangere()

I tidligere vejledning, lærer du, hvordan du sorterer værdierne med funktionen sort(). Biblioteket dplyr har sin sorteringsfunktion. Det fungerer som en charme med rørledningen. Ordet arrangere() kan omarrangere en eller mange rækker, enten stigende (standard) eller faldende.

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

Vi kan sortere afstanden efter destination.

# 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 Verber i R: Hurtig reference

Tabellen nedenfor viser alle verber, der bruges i denne vejledning, med syntaksen og hvad hvert kald returnerer:

Udsagnsord Objektiv Code Forklaring
glimt kontrollere strukturen af ​​en df
glimpse(df)
Samme formål som str(), lettere at læse
Vælg() Vælg/ekskluder variablerne
select(df, A, B ,C)
Vælg variablerne A, B og C
select(df, A:C)
Vælg alle variabler fra A til C
select(df, -C)
Udelad C
filter() Sørg for, at rækkerne matcher en eller flere betingelser
filter(df, condition1)
En betingelse
filter(df, condition1 & condition2)
To betingelser kombineret med AND
arrangere() Sorter datasættet med en eller flere variabler
arrange(A)
Stigende slags variabel A
arrange(A, B)
Stigende slags variabel A og B
arrange(desc(A), B)
Faldende slags variabel A og stigende slags B
%>% Opret en pipeline mellem hvert trin
step 1 %>% step 2 %>% step 3

Ofte Stillede Spørgsmål

magrittr %>%-pipen leveres med dplyr og understøtter placeholder-syntaks med et punktum. Den native |>-pipe kom i R 4.1 og behøver ingen pakke. Begge sender det venstre resultat ind i det første argument til højre.

Nej. Hvert dplyr-verbum returnerer en ny dataramme og lader inputtet være uberørt. Du skal tildele resultatet til et objekt eller videresende det, for at ændringen bevares.

En sammenligning med NA returnerer NA i stedet for TRUE, og filter() gemmer kun rækker, der er TRUE. Brug is.na() til bevidst at vælge manglende værdier, eller drop_na() fra tidyr for at fjerne dem.

Funktionsudvikling til AI-modeller består primært af filtrering af rækker, valg af kolonner og sortering. dplyr udtrykker disse trin som læsbare pipelines, som korrekturlæsere kan revidere, hvilket er vigtigt, når et træningsdatasæt skal være reproducerbart.

Ja. AI-assistenter kan oversætte bracket subsetting til select()- og filter()-kald og forklare pipen. Kør altid begge versioner og sammenlign dimensioner, fordi base R og dplyr behandler manglende værdier forskelligt.

Opsummer dette indlæg med: