1.10 Pipe-operatoren %>%
og enkel datavask
Vi går gjennom to nyttige programmeringsteknikker som begge er inneholdt i dplyr
-pakken:
- Pipe-operatoren
%>%
. som gjør at vi kan skrive opp en sekvens av funksjonskall i den rekkefølgen de skal kjøres, og uten å miste oversikten i et hav av paranteser. - Funksjoner for enkel datavask:
select()
for å velge ut kolonner i et datasett,filter()
for å filtrere rader basert på kriterier, ogmutate()
for å lage nye kolonner.
Her er et par ekstra tips i denne sammenhengen:
- Når du bruker
select()
, så kan du bruke minustegnet for å spesifisere kolonner som du ikke vil ha med:testdata %>% select(-X1)
. - I
filter()
-funksjonen så kan vi bruke andre kriterier enn større enn (>
):<
= “mindre enn”>=
= “større enn eller lik”<=
= “mindre enn eller lik”==
= “er lik”!=
= “er ikke lik”
# Vi kan bruke klammeparantesen til å hente ut enkelttall, kolonner eller rader:
testdata[1,2]
testdata[1,]
testdata[,2]
testdata[, c("X1", "X2")]
# Vi kan også filtrere ut rader basert på kriterier:
testdata[testdata$X1 > 100,]
# Eller vi kan legge til en ny kolonne, som er summen av to kolonner
testdata$sum <- testdata$X1 + testdata$X2
# Det finnes en enklere måte å gjøre dette på ved hjelp av den såkalte
# "pipe"-operatoren og egne funksjoner for datamanipulasjon. Begge deler
# er inkludert i dplyr-pakken, som du eventuelt på installere:
# install.packages("dplyr")
library(dplyr)
# Det første konseptet er pipen, og det er en veldig fin kommando når vi
# skal bruke flere funksjoner etter hverandre. La oss si at vi skal regne ut
# logaritmen til kvadratroten til 2. I base R kan vi skrive:
log(sqrt(2))
# Kvadratroten av 2 skrevet som en pipe blir
2 %>% sqrt
# ... og logaritmen til kvadratroten til 2 blir da
2 %>% sqrt %>% log
# Dette kan vi lese fra venstre mot høyre i den rekkefølgen det skjer, og vi trenger
# ikke holde styr på flere lag med paranteser.
# Dette er en teknikk som gjør det veldig greit å jobbe med tabeller av data, og
# vi skal se på tre veldig sentrale funksjoner i dplyr-pakken:
# Bruk "select()" til å velge kolonner i et datasett:
testdata %>% select(X1, X2)
# Bruk "filter()" for å filtrere ut rader basert på kriterier:
testdata %>% filter(X1 > 100)
# Bruk "mutate()" for å lage nye kolonner, gjerne basert på de vi allerede har:
testdata %>% mutate(sum = X1 + X2)
# Legg merke til at vi her bare skriver navnet på datasettet en gang, nemlig helt i
# starten. Vi kan også kjøre flere slike pipes etter hverandre, og lagre resultatet
# i en ny variabel:
ny_testdata <-
testdata %>%
select(X1, X2) %>%
filter(X1 > 100) %>%
mutate(sum = X1 + X2)
Oppgave: Basert på testdata
, lag en tabell som bare inneholder radene der A1
-kolonnen er lik 1 og A2
-kolonnen er lik 0, men der vi bare skal ha med kolonnene X1
og X2
. Lag til slutt en ny kolonne som inneholder differansen av tallene i X1
og X2
-kolonnene.