1.10 Pipe-operatoren %>% og enkel datavask

Vi går gjennom to nyttige programmeringsteknikker som begge er inneholdt i dplyr-pakken:

  1. 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.
  2. Funksjoner for enkel datavask: select() for å velge ut kolonner i et datasett, filter() for å filtrere rader basert på kriterier, og mutate() 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.

Løsning
testdata %>% 
  filter(A1 == 1) %>% 
  filter(A2 == 0) %>% 
  select(X1, X2) %>% 
  mutate(differanse = X1 - X2)