R-kurs 1: Enkel databehandling med tidyverse

Denne posten baserer seg på et kort kurs jeg holdt som introduksjon til R og Tidyverse. Posten inneholder slidene fra presentasjonen og går igjennom ulike deler av databehandling med dplyr. Posten tar både opp bruken av pipe “|>” og ulike sentrale “verb” fra dplyr slik som “filter”, “mutate” og “summarize”.

Øyvind Bugge Solheim
2024-09-12

Introduksjon

Denne posten er slidene til en innføring jeg holdt i R og Tidyverse. Jeg har holdt en liknende innføring tidligere, men jeg likte ikke den da jeg kom tilbake til den etter litt tid. Den forrige innføringen kan fortsatt leses for å få en god forståelse av R når man har kommet igang, men i denne posten forsøker jeg heller å komme til poenget litt raskere. Målet er at man raskt kommer til å få en følelse av hvordan R virker og særlig hvordan Tidyverse-logikken fungerer. Forhåpentligvis er det et større bidrag enn den forrige posten. Jeg har også skrevet en innføring i data.table som kan være relevant for folk som driver med stordata og registerdata. data.table har en annen syntaks (kanskje mindre rett fram), men går som regel raskere enn Tidyverse. Jeg bruker selv for det meste data.table fordi det var det jeg lærte meg først.

Ting du trenger før du starter:

“Kognitiv dissonans er bra!”

R Core Team (1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024)

(Hvis ikke hadde ingen likt R..)

Det er krevende å lære R, så man hjernen lurer oss til å like det.

Sette opp R og RStudio

Velkommen til RStudio

Det er fire områder i RStudio

Til venstre:

  1. Syntaksfeltet ligger øverst til venstre som standard

  2. Nederst til venstre ligger console. Der kommer outputen når man kjører kode


Til høyre:

  1. Øverst til høyre er det flere ulike faner men Environment er viktigst. Environment viser hvilke objekter dere har laget. For eksempel tabeller. R kan ha mange objekter samtidig, så det er fint mulig å åpne flere datasett og jobbe med dem parallelt.

  1. Nederst til høyre er det også flere faner:

    1. Filer viser mappa dere er i (ikke sikkert det er mappa R forholder seg til)

    2. Plot viser figurene dere har laget.

    3. Packages viser alle pakkene dere har.

    4. Help viser hjelpedokumenter

    5. Viewer viser tabeller fra noen pakker

Hvordan løse problemene som oppstår?

Rstudio er best med prosjekter

R er lagd på dugnad

Hvordan bruke R :


## Her kan man skrive R-kode
## Firkant lager kommentarer
## Stå under og trykk control (ctrl) + enter/linjeskift
1+1
1+
  
  

10

## eller denne:
(55 
  
#Det kan til og med være kommentarer imellom  
  
-1)

Andre nyttige snarveier:


Grunnleggende elementer

Laste inn pakker:


Laste inn pakker:

## Merk linjene under og bruk control shift c 
## til å fjerne kommentarfirkanten. 
#Det ikke nødvendig å installere pakker 
## når man allerede har gjort det.

## install.packages("here")
## install.packages("tidyverse")

Tidyverse består av mange pakker

dplyr for databehandling

Laste inn datasett

Laste inn fil

## Vi glemte å laste inn haven:
## Er det installert?
library(haven)

datasett<- read_dta(here("_data/ESS/ESS11_kort.dta"))

Lagre datasett

  1. Stata
  2. Csv
  3. R

## Mappen Data må finnes
datasett |> 
  saveRDS(file = here("fil.rds"))

#Får dere til å lage en statafil og en spss-fil?
## Test write_ og tab

Pipe: |>


c(1,2,3,4)
[1] 1 2 3 4
c(1,2,3,4) |> 
  mean()
[1] 2.5

Hvor mange år utdanning?


## regner ut antall år utdanning:
## for å ignorere missing skriver vi na.rm=TRUE
datasett |> 
  summarize(`Gjennomsnittlig antall år utdanning`=mean(eduyrs,na.rm=T))
datasett |> 
  summarize(`Gjennomsnittlig alder`=mean(agea,na.rm=T))
#hva med medianen?
#

Bli kjent med et datasett


## Vi kan se en oversikt over variablene:
datasett |>
  glimpse()

## Vi kan åpne datasettet i Rstudio
## Dette er det samme som å trykke øverst til høyre
datasett |> 
  View()

Vi kan også hente ut noen rader:


#Vi kan se topp
datasett |> 
  slice_head(n = 5)
## vi kan se bunn 
datasett |> 
  slice_max(eduyrs,n = 5)

Avgrense datasettet

filter()


## hvis vi er interessert i bare Norge er det naturlig å filtrere ut de norske dataene:
## library(magrittr)
datasett |>
  filter(cntry=="NO") |>
  summarize(`Gjennomsnittlig antall år utdanning (Norge)`=mean(eduyrs,na.rm=T))

datasett |>
  filter(cntry=="NO") |>
    #Bare de som bruker mer enn to timer om dagen på nyheter:
  filter(nwspol>120) |>   
  summarize(`Gjennomsnittlig antall år utdanning (to timer TV)`=mean(eduyrs,na.rm=T))

#ikke menn og mer enn 15 år utdanning
datasett |>
    filter(cntry=="NO") |>
  filter(gndr!=1&eduyrs>15) %>% 
  summarize(`Gjennomsnittlig alder (kvinner med mer enn 15 års utdanning)`=mean(agea,na.rm=T))

R lagrer ingenting av seg selv


## Hvordan lagrer vi dette?
datasett |>
  filter(cntry=="NO")

Grupper


datasett
#gruppér
#Regn ut snitt

Slå sammen datasett

Noen ganger har vi flere datasett som gjelder de samme svarene fordi noen syntes det var det lureste.

Join


datasett_edu <- read_dta("_data/ESS/ESS11_edu.dta")

datasett_begge<- left_join(datasett,datasett_edu,by = "idno")

Vi kan hente ut enkeltvariabler


#vi kan velge ut enkelte variabler
datasett |> 
  select(eduyrs)

datasett_begge |> 
  select(starts_with("edu"))

datasett_begge |> 
  arrange(desc(eduyrs)) %>% 
  select(eduyrs,edulvlb) 

case_when gjør det lett å omkode en variabel


datasett_begge<- datasett_begge %>% 
  mutate(utdanning=factor(case_when(edulvlb<300~"Grunnskole",
                             edulvlb<400~"Videregående",
                             edulvlb<500~"Fagskole",
                             edulvlb<700~"Universitet og høyskole treårig",
                             edulvlb>700~"Master eller mer"),
                          levels=c("Grunnskole","Videregående","Fagskole","Universitet og høyskole treårig","Master eller mer")
                          )) 


## Fungerte det?
datasett_begge %>% 
  filter(cntry=="NO") %>% 
  group_by(edulvlb,utdanning) %>% 
  summarize(n())

Vi kan regne ut prosenter ved å kombinere n() med group_by()


datasett_begge %>% 
  #Bare Norge
  filter(cntry=="NO") %>% 
  #Grupperer med utdanning
  group_by(utdanning) %>% 
  #Regner ut antall av hver utdanning
  summarize(Antall=n()) %>% 
  ## Deler på totalantallet
  reframe(Utdanning=utdanning,Prosent=Antall/sum(Antall)*100)

datasett_begge %>% 
  #Grupperer med utdanning
  group_by(cntry,utdanning) %>% 
  #Regner ut antall av hver utdanning
  summarize(Antall=n()) %>% 
  ## Deler på totalantallet
  reframe(Utdanning=utdanning,Prosent=Antall/sum(Antall)*100) %>% 
  pivot_wider(id_cols=Utdanning,names_from = cntry,values_from = Prosent)

Vi kan regne ut det samme for flere kolonner med across()

datasett_begge %>% 
  #Bare Norge
  filter(cntry=="NO") %>% 
  summarize(across(where(is.numeric),
                   list(Minimum=min,Maximum=max,Mean=mean)))

Flere ressurser:

data.table

Mer om R-syntaks

Citation

For attribution, please cite this work as

Solheim (2024, Sept. 12). Solheim: R-kurs 1: Enkel databehandling med tidyverse. Retrieved from https://www.oyvindsolheim.com/code/Tidyversekurs/

BibTeX citation

@misc{solheim2024r-kurs,
  author = {Solheim, Øyvind Bugge},
  title = {Solheim: R-kurs 1: Enkel databehandling med tidyverse},
  url = {https://www.oyvindsolheim.com/code/Tidyversekurs/},
  year = {2024}
}