Kapitel 5 Bilaga

5.1 Variabeltyper i R

De variabeltyper som finns i R är:

Beskrivning Synonymer typeof() Exempel
Heltal int, numeric integer -2, 0, 1
Reella tal real, double, float, numeric double 1.03, 0.22
Komplexa tal cplx complex 1+2i
Logiska värden booelan, bool, logi logical TRUE, FALSE
Faktorer factors fctr “Women”
Datum dates date “2017-02-04”
Text string, char character “Hello R!”

flights är en så kallad data.frame som egentligen är en samling vektorer. data.frame är den vanligaste data-typen i R för att arbeta med data.

Om du är nyfiken på att undersöka variabeltypen, eller klassen, på ett objekt eller en kolumn kan du använda funktionen class()

class(x)
## [1] "numeric"
class(text)
## [1] "character"

5.1.1 Vektorer

Vektorer är ett objekt i R som innehåller en eller flera element. En vektor kan endast innehålla en typ av variabel. Det vanligaste sättet att skapa en vektor är genom c().

# Numerisk vektor
numvec <- c(1,4,7)

# Textvektor
charvec <- c("Kalle", "Anka")

5.1.2 Faktorvariabel

En annan typ av variabel är den såkallade faktorer, factor. Faktorer är kategoriska variabler som har olika nivåer som representerar fakta. Kön eller åldersgrupp är exempel på faktorer.

# minText är en textvektor
min_text <- c("A", "B", "A", "A")

# Konvertera minText till faktorvariabel med as.factor
min_faktor <- as.factor(min_text)

min_faktor
## [1] A B A A
## Levels: A B
# För att undersöka klassen av vektorn minFaktor
class(min_faktor)
## [1] "factor"
# För att undersöka vilka unika värden finns på minFaktor 
levels(min_faktor)
## [1] "A" "B"

5.1.3 Logik

Logiska värdena förekommer ofta i programmeringsvärlden. De logiska värdena i R är: TRUE, FALSE och NA.

5.1.3.1 Logiska operatorer

Logiska operatorer är de operatorer som bara kan användas på logiska vektorer. Det kallas även för boolsk algebra.

De viktigaste operatorerna i R visas i tabellen nedan.

Operator Symbol i R
och (and) &
eller(or) |
icke(not) !

5.1.3.2 Relationsoperatorer

Man vill ofta jämföra olika vektorer för att sedan indexera en datamängd. Detta görs med hjälp av relationsoperatorer som beskrivs nedan.

  1. Använder relationsoperatorer för att jämföra olika variabler.
  2. Relationsoperatorer returnerar logiska värde.
  3. Logiska värdena används sedan för indexering.

De vanligaste relationsoperatorer i R är följande:

Relationsoperatorer Symbol i R
lika ==
inte lika !=
större än eller lika >=
mindre än eller lika <=
större än >
mindre än <
finns i %in%

5.1.4 Matriser

Matriser är också en av de vanligaste datastruktur i R. Den har två dimensioner, rader och kolumner. Likt som vektorer så kan matriser bara innehålla en typ av element. Det innebär att en matris kan endast vara en textmatris, numerisk matris eller logisk matris.

Matriserna kan skapas enkelt i R med funktionen matrix().

min_matris <- matrix(data=c(1,2,3,4), nrow=2)
min_matris
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4

5.1.5 Data.frame

data.frame är en tabell som innehåller flera olika typer av variabler. Det är egentligen en samling av vektorer, därför kan en data.frame innehålla olika typer av vektorer som numeriska, logiska, textsträngar och faktorer.

För att skapa ett dataset i R används funktionen data.frame()

df <- data.frame(num = 1:3, text = rep("Text", 3), logi=c(TRUE, TRUE, FALSE)) 
df 
##   num text  logi
## 1   1 Text  TRUE
## 2   2 Text  TRUE
## 3   3 Text FALSE

Det finns ett antal förinstallerade data frames i R som du kan använda, det är även vanligt med paket vars enda syfte är att innehålla data.

För att kolla upp vilka data frames som finns förinstallerade kan du använda funktionen data().

data()

# För att läsa in en data.frame i Global Environment så skriv namn av data inom parentesen
data(iris)
iris

5.1.5.1 $

Även om dplyr är att föredra för datamanipuleringar är det bra att veta att det går att göra samma manipuleringar i R men med en annan syntax. Då använder man i princip endast de inbyggda paketen (ofta kallade för base) som laddas mer R.

En viktig operatör i base-R är $ (extract-operator) som extraherar värden från objekt baserat på namn.

Exempelvis

mtcars$cyl
##  [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4

Med $ kan du också skapa nya variabler.

mtcars$ny_variabel <- mtcars$mpg / mtcars$cyl

Eller döpa om variabler

mtcars$mpg_med_konstigt_namn <- mtcars$mpg

5.1.5.2 colnames()

Om du vill ha dina kolumnnamn som en vektor kan du extrahera dessa med colnames().

colnames(mtcars)
##  [1] "mpg"                   "cyl"                   "disp"                 
##  [4] "hp"                    "drat"                  "wt"                   
##  [7] "qsec"                  "vs"                    "am"                   
## [10] "gear"                  "carb"                  "ny_variabel"          
## [13] "mpg_med_konstigt_namn"

Ibland kanske du har en lista på variabelnamn som du vill att data ska ha.

kolumnnamn <- c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K")

Då kan du applicera colnames() med din vektor på din data.frame.

colnames(mtcars) <- kolumnnamn
mtcars
##                        A B     C   D    E     F     G H I J K       NA   NA
## Mazda RX4           21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 3.500000 21.0
## Mazda RX4 Wag       21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 3.500000 21.0
## Datsun 710          22.8 4 108.0  93 3.85 2.320 18.61 1 1 4 1 5.700000 22.8
## Hornet 4 Drive      21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 3.566667 21.4
## Hornet Sportabout   18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 2.337500 18.7
## Valiant             18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 3.016667 18.1
## Duster 360          14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 1.787500 14.3
## Merc 240D           24.4 4 146.7  62 3.69 3.190 20.00 1 0 4 2 6.100000 24.4
## Merc 230            22.8 4 140.8  95 3.92 3.150 22.90 1 0 4 2 5.700000 22.8
## Merc 280            19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 3.200000 19.2
## Merc 280C           17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4 2.966667 17.8
## Merc 450SE          16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3 2.050000 16.4
## Merc 450SL          17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3 2.162500 17.3
## Merc 450SLC         15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3 1.900000 15.2
## Cadillac Fleetwood  10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4 1.300000 10.4
## Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4 1.300000 10.4
## Chrysler Imperial   14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 1.837500 14.7
## Fiat 128            32.4 4  78.7  66 4.08 2.200 19.47 1 1 4 1 8.100000 32.4
## Honda Civic         30.4 4  75.7  52 4.93 1.615 18.52 1 1 4 2 7.600000 30.4
## Toyota Corolla      33.9 4  71.1  65 4.22 1.835 19.90 1 1 4 1 8.475000 33.9
## Toyota Corona       21.5 4 120.1  97 3.70 2.465 20.01 1 0 3 1 5.375000 21.5
## Dodge Challenger    15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2 1.937500 15.5
## AMC Javelin         15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2 1.900000 15.2
## Camaro Z28          13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4 1.662500 13.3
## Pontiac Firebird    19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2 2.400000 19.2
## Fiat X1-9           27.3 4  79.0  66 4.08 1.935 18.90 1 1 4 1 6.825000 27.3
## Porsche 914-2       26.0 4 120.3  91 4.43 2.140 16.70 0 1 5 2 6.500000 26.0
## Lotus Europa        30.4 4  95.1 113 3.77 1.513 16.90 1 1 5 2 7.600000 30.4
## Ford Pantera L      15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4 1.975000 15.8
## Ferrari Dino        19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6 3.283333 19.7
## Maserati Bora       15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8 1.875000 15.0
## Volvo 142E          21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2 5.350000 21.4

5.1.6 Listor

Listor är mer generell datastruktur i R. Man kan jämföra lista med en “låda” som innehåller olika datastrukter i R. En lista kan innehålla vektorer, data.frame och matriser, i olika längd och storlek, samtidigt.

För att skapa en lista används funktionen list()

# skapar vektorer a, b, c
a <- c("hej", "Kalle", "hejdå")
b <- c(TRUE, FALSE, FALSE, TRUE)
c <- 1:8

x <- list(a,b,c)
x
## [[1]]
## [1] "hej"   "Kalle" "hejdå"
## 
## [[2]]
## [1]  TRUE FALSE FALSE  TRUE
## 
## [[3]]
## [1] 1 2 3 4 5 6 7 8

Ett mycket vanligt exempel på en lista är modellobjekt, dvs objektet man skapar när man anpassar en modell, till exempel en regressionsmodell. Hela resultatet från modellanpassningen ligger på en lista. Se nedan.

# Skapar en data.frame
ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14)
trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69)
group <- gl(2, 10, 20, labels = c("Ctl","Trt"))
weight <- c(ctl, trt)

# Linjär regression.
lm <- lm(weight ~ group)

is.list(lm)
## [1] TRUE
# Vilka element eller objekt som finns i listan lm? 
attributes(lm)
## $names
##  [1] "coefficients"  "residuals"     "effects"       "rank"         
##  [5] "fitted.values" "assign"        "qr"            "df.residual"  
##  [9] "contrasts"     "xlevels"       "call"          "terms"        
## [13] "model"        
## 
## $class
## [1] "lm"

lm är en lista som innehåller bland annat regressions koefficienter, residualer, anpassade värden, mm.

5.1.7 Datum

I R uttrycks datum som antal dagar från 1970-01-01. Datum som kommer innan det skrivs ut som negativa värde.

minaDatum <- as.Date(c("2018-08-14", "1970-01-01"))

minaDatum[1] - minaDatum[2]
## Time difference of 17757 days
as.Date(17757, origin = "1970-01-01")
## [1] "2018-08-14"

Sys.Date() ger dagens datum. date() returnerar dagens veckodag, datum och tid.

5.1.7.1 Olika datumformat

Symbol i R Betydelse Exempel
%d | dag dagnummer 01-31
%a förkortad veckodag Mon
%A | ful full veckodag Monday
%m | mån månad nummer 00-12
%b förkortad månad Jan
%B | ful full månad January
%y 2 siffrig år 18
%Y | 4 s 4 siffrig år 2018

5.1.7.2 Formatera datum

idag <- Sys.Date()

format_idag <- format(idag, format = "%B %d %Y")
format_idag
## [1] "November 16 2020"
format(minaDatum[2], format="%m/%d/%y")
## [1] "01/01/70"

5.2 Indexering

Ibland är man bara intresserad av en kolumn eller enstaka värde. För att indexera eller plocka ut specifikt element ur ett objekt kan man använda sig av hackparentes [] eller dollar tecken $ och detta görs på olika sätt. ### Genom att ange positions nummer

#Vektor
testScore <- c(7, 15, 20, 20, 23, 1.2)
testScore[3] #tredje element
## [1] 20
testScore[-1] #alla utom den första
## [1] 15.0 20.0 20.0 23.0  1.2

Kör koden nedan för att se resultatet.

#Data.frame.
data(iris)
iris[, 1] # Väljer kolumn nummer 1
iris[1:5, c(1,2)] # Rad 1 till 5 på Kolumn 1 och 2

5.2.1 Genom att begränsa värden som man vill plocka ut

# Vektor
testScore[testScore < 10] # alla som är mindre än 10
## [1] 7.0 1.2
testScore[testScore == 20] # alla som är lika med 20
## [1] 20 20

Kör koden nedan för att se resultatet.

# Data.frame
head(iris[iris[,1] > 7,]) # alla observationer där kolumn nummer 1 är större än 7. Funktionen head() används för att minimera rader som skrivs ut. 

5.2.2 Genom att ange namn av elementet eller kolumnen

Det går att namnge element i en vektor. Koder nedan visar hur man ger namn till varje element i en vektor. Efter att ha namngett vektorn kan du nu plocka ut värde med hjälp av namn.

# Sätter namn på respektive element i testScore
names(testScore) <- c("Zaida", "Anna", "Helena", "Per", "Filip", "Annelie")
testScore
##   Zaida    Anna  Helena     Per   Filip Annelie 
##     7.0    15.0    20.0    20.0    23.0     1.2
testScore["Per"]
## Per 
##  20
testScore["Filip"]
## Filip 
##    23
# Kolumnen i en data.frame oftast har namn. Objekt som har 2 eller mer dimensioner kan vi använda oss av dollar tecken.   
colnames(iris)
## [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"