Introduktion till R och R-studio

Sociologisk metod och analys 15 hp

Author

Emil Bertilsson (emil.bertilsson@edu.uu.se)

Varför R?

R är ett öppet, gratis och kraftfullt verktyg för statistisk analys, datahantering och visualisering.

Tip

Varför inte SPSS eller Excel?

R är mer flexibelt, gratis och går att reproducera. R samlar alla typer av analysmetoder som man kan tänkas behöva använda. Kod kan delas och återanvändas – vilket är argument nog…

R-studio

R-studio är ett så kallat “interface” till R som kom 2011 och som underlättar arbetet och användarvändligheten med R avsevärt.

Om vi gör liknelsen med en bil så kan R kan ses som motorn medan R-studio är själva instrumentpanelen. Vi behöver egentligen aldrig ge oss in i motorrummet (dvs. du behöver inte öppna R-programvaran från datorn) utan vi gör alla manövrar från R-studio.

R-studios olika fönster

R-studio är uppdelat i 4 olika fönster.

  1. Skriptpanelen - här skriver du skript (kod) som du kan spara och redigera. Här kommer du att bedriva mest tid under workshoparna.

  2. Konsollen - här kan du köra kod/kommandon som inte sparas. Här genomförs den kod som du kör från skriptpanelen. Här dyker även felmeddelanden och annan information upp.

  3. “Environment” - fönstret där du återfinner dina objekt, data som du importerat eller skapat i R.

  4. Hjälpfönster - som visar filer som du har i din R-mapp, figurer och grafer som du skapat etc.

Notera att första gången du öppnar R-studio så kommer inte att skriptpanelen vara öppen, den öppnas när du skapar ett nytt skript.

Att skriva kod i R

Allt som görs i R baseras på kod. Koden ger instruktioner till R ska behandla, analysera och förändra din data.

Kod kan skrivas i två av fönstrena i R-studio: Skriptpanelen och Konsollen. Den senare är användbar för snabbt genomförande av olika beräkningar eller kommandon som du inte vill spara för senare bruk. I skriptpanelen skapar du ett textdokument som sparas bland dina filer, du kan därför spara det som ett vanligt dokument som kan stängas, öppnas och redigeras.

Skriva kod i konsollen

Note

✏️ Övning:

Testa att skriva 2+2 i konsollen och tryck ENTER.

Konsollen kan alltså fungera ungefär som en avancerad miniräknare. Testa att skriva:

2 + 2
[1] 4
10 / 3
[1] 3.333333
sqrt(25)
[1] 5
Note

✏️ Detta är fler saker som du kan testa att skriva i konsollen:

pi              #[enter] "What's pi?"
23 * 2          #[enter] "what's 23 times 2?"
10 / 2          #[enter] "What's 10 over 2?"
1 < 2           #[enter] "Is 1 smaller than 2?"
2 < 1 
1 < 1
1 <= 1          #[enter] "Is 1 smaller or equal to 1?"
2 == 1 + 1      #[enter] "Is 1 equal to 1 + 1?"
2 == 2 + 1
2 != 2 + 1      #[enter] "Is 2 different to 2 + 1?"
2 != 2
1 : 10          #[enter] "What is (1 to 10) ?"
c(1,2) + c(0,1) #[enter] "What's (1 and 2) + (0 and 1)?"
min(c(1, 2))    #[enter] "What's the minimum of (1 and 2)?"
max(c(1, 2))
mean(c(1, 2))   #[enter] "What's the mean of (1 and 2)?"
mean(0 : 1000)  #[enter] "What's the mean of (0 to 1000)?"

Skriva kod i R-skript

Att köra skript i konsollen är som sagt en snabb och smidig funktion men i de allra flesta fall så är det en fördel att arbeta med kod i ett R-skript. Anledningen är att du då skapar en (text)fil som du kan spara och sedan öppna och köra igen eller bearbeta.

För att skapa ett nytt R-skript i Rstudio så trycker du Ctrl/Cmd+Shift+N eller går via menyn File -> New File -> R Script. Detta öppnar ett nytt fönster i skript panelen och du kan nu börja skriva din kod.

Note

Viktiga funktioner i R-skript

#

När du skriver ett skript så kan du använda hashtaggen för att lägga till kommentarer. En # före en rad kod innebär att texten inte är “aktiv” och kommer därför inte att medföra någon aktion från R.

# Detta är alltså exempel på rader i min kod 
# som fungerar som kommentar

# 2 + 2 - kommer alltså inte generera någon beräkning

Kod som skrivs i ett R-skript exekuteras, dvs. genomförs, när du står på samma rad som din kod och trycker Ctrl + Enter.

Note

✏️ Övning: Skapa ditt första skript

Gör följande:

  • Öppna ett nytt skript via menyn eller med hjälp av snabbkommandot.

  • Överst i skriptet lägg till följande text:

    # Detta är mitt första R-skript

  • Spara skriptet genom att trycka på Spara ikonen i menyn eller Ctrl + S. Namnge skriptet. Skriptet kommer nu att sparas i din projektmapp som en fil med filändelsen .R

Nu kan vi börja fylla på med innehåll i skriptet och se till att det vi gör alltid sparas…

Testa inledningsvis följande:

# Detta är mitt första R-skript

1+1

I ett R-skrip så exekuteras (körs) kod genom att du står i aktiv rad och trycker Ctrl + Enter.

Testa detta med raden ovan.

Installera och använda paket (packages)

R levereras med en mängd funktioner, men dessa kan naturligtvis inte täcka allt du kan tänkas vilja göra med dina data. Det är här paket kommer in i bilden. Paket är samlingar av funktioner och dataset som lägger till nya funktioner och möjligheter i R.

Det första vi ska göra är därför att installera olika paket (packages) som vi kommer att jobba med. Ett paket är centralt för mycket av de vi ska göra:

tidyverse() - ett samlingspaket med mass olika funktioner för datahantering och analys av data.

Note

Installera paket:

Paket i R installeras med funktionen intall.packages()

I ditt R-skript, skriv följande:

# Detta är mitt första R-skript

# Jag installerar paket som jag kommer att använda på kursen

install.packages("tidyverse")
install.packages("ggpubr")
install.packages("kableExtra")

Efter att du har installerat paketen är du fortfarande inte helt klar. Paketet kan ha installerats, men dess funktioner blir inte tillgängliga förrän du laddar det. Medan installationen enbart behöver göras en gång så behöver du ladda paketen varje gång du startar en ny R-session. Detta görs med en enkel kodrad med funktionen library(), och det är rekommendarat att du placerar detta högst upp i dina skript. Vi kan bygga vidare vårt skript med dessa rader kod.

Note

Aktivera paket:

# Detta är mitt första R-skript

# Jag installerar paket som jag kommer att använda på kursen

#install.packages("tidyverse")
#install.packages("data.table")

# Jag laddar paket som jag kommer använda

library(tidyverse)
library(data.table)

! Notera att jag satte en # före install-funktionerna. Detta för att undvika köra installationen i onödan…

Innan vi börjar med data: två nyckelsymboler

<-

<- är “assignment” operatorn. (Snabbkomando: “Alt” + “-”)

Assignment operatorn skapar objekt som sparas i “environment” fönstret.

Testa skriv följande i ditt skript:

mitt_nummer <- 1
ditt_nummer <- 9

mitt_nummer + ditt_nummer
[1] 10

Vilket betyder: “Skapa ett objekt med namnet mitt_nummer och ge det värdet 1. Skapa sedan ett annat objekt med namnet ditt_nummer och ge det värdet 9. Multiplicera sedan dessa objekt med varandra”.

%>%

%>% kallas “pipe” operatorn, men betyder helt enkelt “gör också detta” eller “och sedan”. En pipe väver ihop olika kommandon i R. (Snabbkomando: “Shift” + Ctrl” + “M”). Detta gör (vilket kommer blir tydlig i senare exempel) att man kan bygga samman flera olika avancerade funktioner i samma kodsträng.

1 %>% 
  + 99 %>% 
  - 2 
[1] 98
# Betyder: "Ta värdet "1" och sedan 
# vill jag att du multiplicerar detta tal 
# med "99", och sedan att du subtraherar 
# detta med "2".

Några centrala verb

Mycket av kodningen i R bygger på användandet av olika funktioner. Några av de viktigaste är baserade på olika verb som berättar för R vad vi vill göra med data.

För att testa några av dessa funktioner ska vi inledningsvis använda oss av ett dataset som finns inbyggt i Tidyverse-paketet som vi laddade ovan.

I ditt skript ska du nu skapa ett objekt som heter my_starwars. Om tidyverse är laddat gör du detta med helt enkelt genom att skriva:

my_starwars <- starwars

# Vilket betyder: Skapa objektet my_starwars
# låt det baseras på (datasetet) starwars.

När du kört detta skript kommer du att ha ett nytt objekt i ditt environment fönster med namnet “my_starwars”.

När vi nu har ett objekt med data så finns det ett par funktioner i R som ger oss en snabb överblick över datasetet.

# Testa:

head(my_starwars)
# Testa:

glimpse(my_starwars)
Rows: 87
Columns: 14
$ name       <chr> "Luke Skywalker", "C-3PO", "R2-D2", "Darth Vader", "Leia Or…
$ height     <int> 172, 167, 96, 202, 150, 178, 165, 97, 183, 182, 188, 180, 2…
$ mass       <dbl> 77.0, 75.0, 32.0, 136.0, 49.0, 120.0, 75.0, 32.0, 84.0, 77.…
$ hair_color <chr> "blond", NA, NA, "none", "brown", "brown, grey", "brown", N…
$ skin_color <chr> "fair", "gold", "white, blue", "white", "light", "light", "…
$ eye_color  <chr> "blue", "yellow", "red", "yellow", "brown", "blue", "blue",…
$ birth_year <dbl> 19.0, 112.0, 33.0, 41.9, 19.0, 52.0, 47.0, NA, 24.0, 57.0, …
$ sex        <chr> "male", "none", "none", "male", "female", "male", "female",…
$ gender     <chr> "masculine", "masculine", "masculine", "masculine", "femini…
$ homeworld  <chr> "Tatooine", "Tatooine", "Naboo", "Tatooine", "Alderaan", "T…
$ species    <chr> "Human", "Droid", "Droid", "Human", "Human", "Human", "Huma…
$ films      <list> <"A New Hope", "The Empire Strikes Back", "Return of the J…
$ vehicles   <list> <"Snowspeeder", "Imperial Speeder Bike">, <>, <>, <>, "Imp…
$ starships  <list> <"X-wing", "Imperial shuttle">, <>, <>, "TIE Advanced x1",…

Vi kan konstatera att datasetet består av 87 (rader) individer - eller snarare karaktärer i de olika Starwars-filmerna - och 14 variabler av olika typ.

filter()

Med filter-funktionen så kan du filtrera ut rader som du vill behålla i din data utifrån villkor. Villkoren uttrycks med “Logical operators” och “Relational operators”

# Relational operators

&     betyder "och (and)"
|     betyder "eller (or)"
!     betyder "icke (not)"

# Logical operators

==    betyder "lika"
!=    betyder "inte lika"
>=    betyder "större än eller lika"
<=    betyder "mindre än eller lika"
>     betyder "större än"
<     betyder "mindre än"
%in%  betyder "finns i"

Några exempel på filter-funktionen:

Säga att vi vill filtrera ut alla individer som är längre än 200cm med filter-funktionen:

# Filtrera ut enbart de som är längre än 200 cm

my_starwars %>% # utgå från mitt data objekt, och sen...
  filter(height > 200) # filtrera alla individer längre än 200

Låt säga att vi vill filtrera alla som är längre än 200 cm och med hårfärgen brun, vi skriver:

my_starwars %>% 
  filter(height > 200 & hair_color == "brown")

select()

Select-funktionen används för att filtrera ut de kolumner, dvs. variabler, som du vill behålla. Vi tar ett exempel.

Utifrån vårt dataset så vill vi nu skapa ett nytt objekt (data). Detta dataset ska enbart innehålla variablerna “name”, “height”, “eye_color” och “species”. Vi skriver:

small_starwars <- my_starwars %>% 
  select(name, height, eye_color, species)

# ni får nu ett nytt objekt i 
# med lika många rader som i my_starwars, 
# men med enbart 4 variabler.

#  Vi kan såklart även kombinera select() 
# och filter() funktionen i samma skript.

even_smaller_starwars <- my_starwars %>% 
  select(name, height, eye_color, species) %>% 
  filter(height > 200, eye_color == "blue")

mutate()

Än så länge har vi enbart gjort ändringar i data genom att filtrera rader och/eller kolumner. Men man vill ju ofta addera information eller skapa nya variabler. Då kan vi använda funktionen mutate(). Mutate skapar helt enkelt en ny kolumn i vårt dataset (alt. omvandlar en existerande kolumn, men detta rekommenderas ej).

# Följande skript skapar inom ramen för mutate funktionen
# 2 nya variabler, tall_figures och short_figures
# med värdena TRUE eller FALSE

recoded_starwars <- my_starwars %>% 
  mutate(
    tall_figures   = height >= 220,  
    short_figures  = height <= 80    
  ) 

# Vi kan också skapa en variabel med olika kategorier
# här kombinerar vi mutate() med funktionen case_when()

recoded_starwars <- my_starwars %>% 
  mutate(height_type = case_when(
    height <= 80  ~ "short_figures",
    height >= 220 ~ "tall_figures",
    TRUE ~ "medium_figures"
  ))
# Vi kan sedan använda funktionen count() för att 
# räkna hur många individer som finns i varje kategori

recoded_starwars %>% 
  count(height_type)

summarise()

summarise() är en funktion för att summera data i vårt dataset. Den skapar helt enkelt en ny tabell där varje rad är en sammanfattning av en grupp (se nedan i kombination med group_by) eller hela datasetet.

# Vi ställer frågan, hur många karaktärer finns det i datasetet?

my_starwars %>% 
  summarise(n_characters = n())
# Medelvärdet av längd för hela datasetet.

my_starwars %>% 
  summarise(mean_height = mean(height, na.rm = TRUE))

group_by()

group_by funktionen används för att gruppera rader i ett dataset efter en eller flera variabler, så att du sedan kan göra beräkningar per grupp i stället för på hela datasetet. Group_by säger helt enkelt till R:

”Dela upp datan i mindre grupper baserat på variablerna jag anger — men ändra inte datan än. Förbered det för att en sammanfattning eller beräkning ska göras per grupp.” Ingen ändring av data sker alltså förrän du anger vad du vill göra härnäst.

Säg att vi vill undersöka om det finns skillnader i genomsnittlig längd mellan olika kön i vår data.

my_starwars %>% 
  group_by(gender) %>% 
  summarise(
    n = n(),
    mean_height = mean(height, na.rm = TRUE),
    median_height = median(height, na.rm = TRUE)
  )

Vi kan också använda group_by funktionen i kombination med mutate() för att skapa nya variabler.

starwars_heights <- my_starwars %>% 
  group_by(species) %>% 
   mutate(
    species_mean_height = mean(height, na.rm = TRUE)
  ) %>% 
  select(name, species, height, species_mean_height)

Kort intro till datavisualisering

R har det mest mångsidiga programmet för datavisualisationer ggplot() (en del av Tidyverse paketet)

För att skapa ggplot figurer/grafer/diagram så behöver man ange 3 saker:

  • Vilken dataset/objekt som jag vill använda
  • Vilken del av datat (kolumner/variabler) som jag vill använda och vilket sätt (axlar, olika färger, storlek etc) = aesthetics
  • Hur ska jag visualisera detta: geometries

Vi kan stegvis skapa ett ggplot() objekt:

  1. Ange dataset som vi ska använda:
ggplot(data = my_starwars)

  1. Berätta för R vilken del av data som jag vill använda aes() (aesthetics), nämligen vilken variabel som ska vara på x resp y axeln.
ggplot(data = my_starwars,
       aes(x = mass, y = height)
       )  

  1. Ange därefter hur data ska visualiseras geom() (geometries).
ggplot(data = my_starwars,
       aes(x = mass, y = height)
       ) +
  geom_point()

Vi kanske även vill visualisera något baserat på som vi gör. Låt säga medellängd per variabeln sex. Vi kan göra på följande sätt:

# Vi skapar först ett objekt med de värden som vi vill använda
# i vår figur.

height_sex <- my_starwars %>% 
  group_by(sex) %>% 
  summarise(mean_height = mean(height, na.rm = TRUE)) %>% 
  ungroup()

# Vi använde sedan detta objekt för vår figur

ggplot(data = height_sex, 
       aes(x = sex, y = mean_height, fill = sex)
       ) +
  geom_col()

Varför inte en boxplot där vi kikar på längd utifrån variabeln gender:

ggplot(my_starwars, aes(x = gender, y = height))+
  geom_boxplot()