---
title: "Cykeldata - eksempel"
author: "Team ASTA"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
if(!require(pander)){
  install.packages("pander", dependencies = TRUE, repos = "https://cran.rstudio.com/")
}
if(!file.exists("Allerødruten_postkort_besvarelser_2014.xlsx")){
  stop("Du skal have datafilen i samme mappe som denne Rmarkdown-fil.\n",
       "       Du arbejder lige nu i mappen:\n       ",
       getwd()
       )
}
```

# Data manipulation

## Indlæsning af data

```{r message=FALSE}
library(mosaic)
```

Man kan kun køre "knit" når datafil og Rmarkdown-dokument er i samme mappe.
Hvis man kører koden skridt for skridt med playknappen kræves det at mappen med data samtidig er ens "working directory".
(Kan indstilles i panelet filer ved at gå ind i mappen og vælge tandhjulet "More" og "Set as working directory".)
```{r}
library(readxl)
allerod_data <- read_excel("Allerødruten_postkort_besvarelser_2014.xlsx")
```

Først tjekker vi navnene på variablene (søjlerne):
```{r}
names(allerod_data)
```

## Udvælgelse og omdøbning af variable/søjler

Vi bruger `select()` til både at udvælge de søjlenumre vi vil arbejde med samt give dem nye korte navne:
```{r}
allerod <- allerod_data %>% 
  select(form = 2, formål = 3, distance = 4, startsted = 5,
         tryghed = 9, tilfredshed = 12) 
allerod
```

## Filtrering af rækker

Vi bruger `filter()` til at udvælge observationer (rækker). 
I dette tilfælde beholder vi dem der kun har cyklet og ikke andet:
```{r}
allerod2 <- allerod %>% 
  filter(form == "Cykel" | form == "cykel") %>% 
  select(-form)
```


## Tilføjelse/ændring af søjler

For at tilføje/beregne nye variable (søjler) bruger vi mutate:
```{r}
allerod3 <- allerod2 %>% mutate(rute = "Allerød")
allerod3
```

Vi kan bruge `case_when()` til at dele en tekstvariabel op i nogle cases (kan også bruges til andet end tekst):
```{r}
allerod4 <- allerod3 %>% 
  mutate(formål = case_when(
    formål == "Til/fra arbejde" ~ "kun arbejde",
    formål == "til/fra arbejde" ~ "kun arbejde",
    TRUE ~ "andet"))
```

Hvis man skal arbejde mere med tekststrenge kan man installere pakken `stringr`. F.eks. ville koden nedenfor finde alle der havde svaret noget med arbejde under formål (men R koden er slået fra med `eval=FALSE` i chunk option i tilfælde af at nogen ikke har pakken):
```{r eval=FALSE}
allerod4 <- allerod3 %>% 
  mutate(formål = case_when(
    str_detect(formål, "arbejde") ~ "arbejde",
    TRUE ~ "andet"))
```

## Opdeling af numerisk variabel i grupper

En numerisk variabel kan inddeles i grupper med `cut()`:
```{r}
allerod5 <- allerod4 %>% 
  mutate(tilfredshed_grp = 
           cut(tilfredshed, breaks = c(0, 2.5, 3.5, 6), labels = c("utilfreds", "ligeglad", "tilfreds")))
allerod5
```

## Tjek af datatyper

Nu er vi ved at have data i det rette format til alle vores analyser.
Det sidste vi gør er at tjekke typen af de forskellige variable.
Bemærk f.eks. at R har lavet `tryghed` til en tekststreng `character`. 
Det er fordi ikke alle værdier kunne læses som tal, da der f.eks. står "3 til 4".
Vi kan tvinge den til at være et tal med funktionen `as.numeric()`, men så bliver alt andet end tal til `NA`:
```{r}
allerod6 <- allerod5 %>% mutate(tryghed = as.numeric(tryghed))
allerod6
```

Generelt bør alle variable vi vil bruge til gruppering være gemt som `factor` i R (ved at udspecificere levels kan vi bestemme rækkefølgen -- ellers bliver det bare alfabetisk):
```{r}
dist_lev <- c("Under 5 km", "5-10 km", "10-15 km", "15-20 km", "Over 20 km")
allerod7 <- allerod6 %>% 
  mutate(formål = factor(formål),
         distance = factor(distance, levels = dist_lev))
allerod7
```

### Samlet kommando til datamanipulation

Vi har lavet en masse datasæt undervejs som vi ikke skal bruge til noget.
Vi kunne lige så godt have samlet det hele i en lang kæde af kommandoer:
```{r}
allerod7 <- allerod_data %>% 
  select(form = 2, formål = 3, distance = 4, startsted = 5,
         tryghed = 9, tilfredshed = 12) %>% 
  filter(form == "Cykel" | form == "cykel") %>% 
  select(-form) %>% 
  mutate(rute = "Allerød",
         formål = case_when(
           formål == "Til/fra arbejde" ~ "kun arbejde",
           formål == "til/fra arbejde" ~ "kun arbejde",
           TRUE ~ "andet"),
         tilfredshed_grp = 
           cut(tilfredshed, breaks = c(0, 2.5, 3.5, 6), 
               labels = c("utilfreds", "ligeglad", "tilfreds")),
         tryghed = as.numeric(tryghed),
         formål = factor(formål),
         distance = factor(distance, levels = dist_lev))
```

## Tilføjelse af mere data i samme format

Lad os forestille os vi havde et andet datasæt for supercykelstien Farumruten i samme format.
Hvordan skal vi så samle dette data?
Vi kan kunstigt lave dette eksperiment, ved at lave en kopi af Allerød-data og kalde ruten "Farum":
```{r}
fake_farum <- mutate(allerod7, rute = "Farum")
fake_farum
```

Disse samles med funktionen `bind_rows()`:
```{r}
fake_samlet <- bind_rows(allerod7, fake_farum)
```

Hvis man havde flere søjler med målinger for de samme personer **med præcis de samme rækker** kunne man tilføje dem til datasættet med `bind_cols()`, men den vil vi ikke bruge her.

Endelig findes funktionerne `full_join()`, `inner_join()`, `left_join()` og `right_join()` hvis man skal sammenkøre data hvor rækkerne ikke nødvendigvis er ens og kommer i samme rækkefølge. 
I dette tilfælde kræves det at der findes et id i begge datasæt som de kan sammenkøres efter. 
F.eks. for data over kommuner, kan man bruge kommunenavnet som id hvis det er stavet ens i begge datasæt.

# Opsummering/visualisering af data

## Tabeller

Optælling af kvalitative variable (hvor mange respondenter har svaret de forskellige kategorier) gøres med `tally()` (betyder sammentælling):
```{r}
dist <- tally(~ distance, data = allerod7)
dist
```
```{r}
dist_tilfreds <- tally(distance ~ tilfredshed_grp, data = allerod7)
dist_tilfreds
```

Tabeller kan skrives pænt i jeres rapport hvis I har installeret pakken `pander` (denne Rmarkdown-fil forsøger at gøre det automatisk for jer):
```{r}
library(pander)
pander(dist_tilfreds, caption = "Tabel over cykeldistance og tilfredshed med cykelruten.")
```

## Grafik

### Kvalitative variable illustreres typisk i søjle diagrammer

Brugbare funktioner er f.eks. `gf_percents()` og `gf_bar()`. Her vises nogle eksempler med `gf_percents()` (bemærk brugen af `gf_labs()` i sidste plot for at tilføje og ændre tekst):
```{r}
gf_percents(~distance, data = allerod7)
```
```{r}
gf_percents(~distance, fill = ~tilfredshed_grp, data = allerod7)
```
```{r}
gf_percents(~distance, fill = ~tilfredshed_grp, data = allerod7, position = position_dodge()) %>% 
  gf_labs(title = "Tilfredshed og distance på Allerød-ruten",
          x = "Cyklet distance",
          y = "Andel af respondenter i %",
          fill = "Tilfredshedsgruppe")
```

### Kvantitative variable med "over plotting"-problem

Der er mange respondenter med samme værdier som plottes oveni hinanden:
```{r}
gf_point(tilfredshed ~ tryghed, data = allerod7, color = ~formål)
```

Vi kan ryste (jitter) punkterne lidt:
```{r}
gf_jitter(tilfredshed ~ tryghed, data = allerod7, color = ~formål, width = 0.3, height = 0.3) %>% 
  gf_labs(title = "Sammenhæng mellem tilfredshed og tryghed",
          xlab = "Tryghedsscore på skala 1-5",
          ylab = "Tilfredshedsscore på skala 1-5",
          color = "Turens formål")
```


### PS

Hvis man har de rigtige pakker kan man også lave et kort med startsteder (her er det kun for respondent 2-10, da ikke alle adresser kan findes):
```{r eval=FALSE}
start <- allerod7$startsted[2:10]
lon_lat <- as.data.frame(t(sapply(start, RgoogleMaps::getGeoCode)))
mapview::mapview(lon_lat, xcol = "lon", ycol = "lat", crs = 4326, grid = FALSE)
```

