Gå till index

Data Science med R

0% färdig
0/42 Steps
avsnitt 5, Ämne 1

Objekt, vektorer & datatyper i R

Johan Svensson februari 17, 2020
avsnitt Progress
0% färdig

Att skapa och manipulera objekt i R

R använder objekt för att lagra information. Här är ett mycket enkelt objekt, som bara lagrar det numeriska värdet 1:

my_number <- 1

Vi skapade ett objekt med namnet my_number och tilldelade (med hjälp av symbolen <-) det numeriska värdet 1 till det. Nu innehåller objektet my_number information, dvs. ett numeriskt värde. Låt oss fråga R vilken typ av objekt my_number är:

class(my_number)
## [1] "numeric"

R tolkar my_number som ett ”numeriskt” objekt, vilket är det vi förväntar oss. Låt oss göra samma procedur med en sträng istället:

my_string <- "This is a string"
class(my_string)
## [1] "character"

This object, on the other hand, is a “character” object, which is also expected. It follows that as we create objects, R will try to guess the nature of the objects. The guessing is done by evaluatingn the contents of the object. Let’s see how R reacts to a numeric value wrapped in quotation marks:

Detta objekt tolkas av R som ”character”, vilket är en sträng och det förväntar vi oss eftersom objektet innehåller icke-numeriska tecken. Detta innebär att när vi skapar objekt så kommer R automatiskt gissa objektens natur. Gissningen görs genom att utvärderai objektets innehåll. Låt oss se hur R tolkar ett numeriskt värde som omges av citattecken (""):

my_string <- "1"
class(my_string)
## [1] "character"

Spännande! Eftersom vi omslöt siffran 1 med citattecken så tolkar R objektet som ett strängobjekt! Alla objekt som skapas med hjälp av citattecken kommer tolkas av R som strängar.

Den största skillnaden mellan strängar och numeriska objekt är att strängar inte kan användas i matematiska operationer, även om hela strängen består av numeriska värden. R vill inte genomföra matematiska operationer på strängojekt, vilket följande exempel demonstrerar.

> my_number <- "1"
> my_number * 2
## [1] Evaluation error: non-numeric argument to binary operator.

Det finns många typer av objekt i R, allt från enkla objekt som lagrar en eller flera numeriska värden, till hela listor och dataframes, eller till och med regressionsmodeller. I R lagras all information i form av objekt och beroende på objektets innehåll kan man utföra olika operationer på/med objektet.

All data i R lagras i form av objekt.

Atomvektor (atomic vector)

Den enklaste typen av objekt i R är en så kallad atomic vector (sv. atomvektor). Atomvektorer finns överallt i R, vilket du snart kommer att märka. Låt oss skapa en atomvektor med hjälp av funktionen c(). Denna funktion kombinerar flera argument för att bilda en vektor. Vi kommer att namnge objektet my_first_vector och det kommer att innehålla sex numeriska värden:

my_first_vector <- c(1, 2, 3, 4, 5, 6)

Vi kan kontrollera om R tolkar my_first_vektor som en atomvektor. Detta görs genom att använda funktionen is.vector():

is.vector(my_first_vector)
## [1] TRUE

The function is.vector() returned the value TRUE which means that my_first_vector is an atomic vector. Since my_first_vector only contain numerics values, R will also classify it as a numeric vector, which you can check by using the function is.numeric():

Funktionen is.vector() returnerade värdet TRUE, vilket innebär att my_first_vector är en atomvektor. Eftersom my_first_vector bara innehåller numeriska värden, kommer R också tolka den som en numerisk vektor, vilket du kan kontrollera med hjälp av funktionen is.numeric():

is.numeric(my_first_vector)
## [1] TRUE

DEtta betyder att en och samma vektor kan uppfylla flera kriterier. Vektorn my_first_vector är både atomic och numeric!

Atomvektorer lagrar värden i form av endimensionella vektorer. Varje atomvektor kan bara lagra en enda typ av data. För att hantera alla typer av data finns därför sex grundläggande typer av atomvektorer, vars definitioner följer:

  • double: numeric values with decimals
  • integer: numeric values without decimals
  • character: any character value
  • logical: these vectors can only be TRUE or FALSE.
  • complex and raw are less commonly used.

Så här kan dessa vektorer skapas med hjälp av c():

my_doubles <- c(1.2, 2.4, 32.1)

my_integers <- c(1L, 2L, 3L)

my_characters <- c("A", "B", "Hello", "My phone is dead")

my_logicals <- c(TRUE, TRUE, FALSE, TRUE, FALSE)

Du kan kontrollera om en vektor är något av ovanstående genom att använda funktionerna is.double(),  is.numeric(),  is.character(),  is.logical(). Dessa funktioner returnerar värdet TRUE eller FALSE.

I de flesta fall kommer du att känna till dina variabler väl. Men om du behöver kontrollera vilken typ av vektor ett objekt är kan du använda funktionen typeof():

my_doubles <- c(1.2, 2.4, 32.1)
typeof(my_doubles)
## [1] "double"

Vektorers längd

Längden på en vektor är helt enkelt antalet informationsenheter i den. Låt oss skapa en atomvektor med 5 numeriska värden och undersöka längden på den:

my_values <- c(1, 2, 3, 4, 5)
length(my_values)
## [1] 5

Låt oss skapa en vektor som är en lång sträng och undersöka längden:

my_string <- c("I am becoming a great data scientist and I love it.")
length(my_string)
## [1] 1

Längden på detta objekt var 1, vilket beror på att vektorn innehöll 1 element, nämligen meningen ”I am becoming a great data scientist and I love it.”. Låt oss lägga till ytterligare en mening i samma vektor. Detta görs genom att använda kommatecken , och därefter skriva den andra meningen, som följer:

my_string <- c("I am becoming a great data scientist and I love it.", "My name is difficult to spell.")
length(my_string)
## [1] 2

As evident, these two sentences (or more precisely, these two character strings) are contained in an object of length 2.

Som framgår ovan finns det två meningar i detta objektet. Tekniskt uttalat finns det två strängar (eng. character strings) i detta objektet.

En atomvektor kan bara lagra en typ av data. Låt oss utmana detta genom att skapa en atomvektor med både numeriska värden, strängar och logiska värden:

# Skapa vektorn
mixed <- c("I love data science.", 1, 2, TRUE, FALSE)

# Skriv ut resultaten
mixed
## [1] "I love data science." "1"                    "2"                   
## [4] "TRUE"                 "FALSE"

Notice that all arguments, including 12TRUE and FALSE are printed with quotation marks. This is because they have been transformed to character strings! This is called coercion, i.e one data type was automatically transformed to another. The class() function claims that the vector mixed is of type character. So you can no longer perform mathematical operations with the numbers 1 and 2 in the object, since they have been coerced to characters.

Observera att alla argument, inklusive 1, 2, SANT och FALSKT skrivs ut med citattecken! Detta beror på att R har omvandlat allt till strängar! Detta kallas coercion (sv. tvingande), vilket innebär att en datatyp omvandlas automatiskt till en annan. Funktionen class() eller typeof() kan användas för att kontrollera hur R tolkar objektet mixed.

# Check how R interprets the vector
class(mixed)
## [1] "character"

Objektet är nu ett strängobjekt (string) och vi kan därför inte längre utföra matematiska operationer på objektet.

Ibland vill man skapa atomvektorer med siffror, men sedan behandla siffrorna som strängar. Detta kan göras genom att antingen använda citattecken runt siffrorna eller använda funktionen as.character():

Exempel 1: Använda as.character()

my_numbers <- c(1, 2, 3, 4)

# Visa resultat
my_numbers
[1] 1 2 3 4
as.character(my_numbers)
[1] "1" "2" "3" "4"

Exempel 2: Lagra siffrorna som strängar direkt

my_characters <- c("1", "2", "3", "4")

# Visa resultat
my_characters
[1] "1" "2" "3" "4"

Lägg märke till hur siffrorna i sista utskriften är omslutna av citattecken, vilket indikerar att de är strängar, och inte siffror!

Exempel 3: Konvertera numeriska värden till tecken

my_numbers <- c(1, 2, 3, 4)

my_characters <- as.character(my_numbers)

# Visa resultat
my_characters
## [1] "1" "2" "3" "4"

Således kan du konvertera vektor mellan olika typer. Låt oss prova motsatsen, dvs gå från tecken till numerisk:

Exempel 4: Konvertera strängar till numeriska siffror:

my_characters <- c("1", "2", "3", "4")

my_numbers <- as.numeric(my_characters)

# Visa resultat
my_numbers
## [1] 1 2 3 4

This turned out well since the numbers appeared in the correct order and without quotation marks (so they are actual numeric values). However, covnerting between vector types can produce unexpected results so always check manually whether the conversion yielded the expected results. Let’s try to convert the string Hello to a numeric value:

Detta gick bra eftersom ”1” omvandlades till 1, ”2” omvandlades till 2, ”3” omvandlades till 3 och ”4” omvandlades till 4. Men konvertering mellan vektortyper kan ge oväntade resultat, varför man alltid måste kontrollera om konverteringen givit de förväntade resultatet. Låt oss försöka konvertera strängen ”Hej” till ett numeriskt värde:

my_characters <- c("Hej")
my_numbers <- as.numeric(my_characters)
Warning: NAs introduced by coercion
# Kontrollera resultatet
my_numbers
## [1] NA

Vi fick en varning: “Warning: NAs introduced by coercion”NA (Not Available) är symbolen för saknat värde i R. Det innebär att omvandlingen resulterade i att elementet ”Hej” ersattes med NA, dvs ingenting. ”Hej” kunde alltså inte tvingas till ett numeriskt värde.

Tvingande mekanismer (coercion)

R har vissa tvångsbeteenden. Dessa tvångsbeteenden kommer till uttryck när man läser in och omvandlar datatyper. Du har redan stött på vissa av dessa tvångsbeteende här ovan men låt oss titta på de i detalj:

  • Om det finns en symbol eller ett tecken, oavsett dess natur, i en vektor så kommer R omvandla vektorn till en character string. Detta gäller hela vektorns innehåll, inklusive siffror.
  • Om en vektor endast innehåller logiska värden och siffror, så kommer R konvertera logiska värden (TRUE, FALSE) till siffror. Alla TRUE blir 1 och alla FALSE blir 0.

Ett enkelt exempel på coercion följer. Funktionen  sum() summerar siffrorna i en vektor. Här skapas en vektor som består av logiska värden och på den tillämpar vi funktionen sum(). Observera att vi skapar vektorn med funktionen c() som kombinerar flera element separerade med kommatecken ,.

sum(c(TRUE, TRUE, FALSE, FALSE))

R tvingar TRUE till 1 och FALSE till 0, och gör beräkningen enligt:

sum(c(1, 1, 0, 0))
[1] 2

På samma vis kan du beräkna medelvärdet på en logisk vektor, som följer:

mean(c(1, 1, 0, 0))
[1] 0.5

Du kan be R konvertera data från en typ till en annan med as funktionerna. R kommer att konvertera data om det är möjligt:

as.character(1)
## "1"

as.logical(1)
## TRUE

as.numeric(FALSE)
## 0

Attribut

Objekt i R kan ha attribut och detta kan vara förvirrande. Attribut kan ses som ytterligare information eller förtydligande som du kopplar till objekt och vektorer. Attribut påverkar inte några matematiska eller andra operationer; R ignorerar i princip dina attribut. Det finns dock några användbara attribut som du kommer att använda dagligen, särskilt attributet name.

Namn (names)

Låt oss skapa en enkel data frame med 2 kolumner (variabler), mnämligen kön och blodtryck.

# Create a vector called "sex"
sex <- c("Man", "Woman", "Man", "Woman")

# Create a vector called "pressure"
bloodpressure <- c(140, 130, 120, 150)

# Combine vectors into a data frame, using the function data.frame()
my_data_frame <- data.frame(sex, bloodpressure)

We created the data frame by wrapping the objects sex and bloodpressure with the R function data.frame() which creates a conventional table, which we can now view:

Vi skapade vår data frame genom att omsluta objekten sex och bloodpressure med R-funktionen data.frame() som skapar en vanlig tabell (data frame), vilken vi nu ska titta på:

my_data_frame
##     sex bloodpressure
## 1   Man           140
## 2 Woman           130
## 3   Man           120
## 4 Woman           150

Vår data frame har 4 rader och 2 kolumner (variabler). Låt oss kontrollera attributen för det här objektet. Vi kommer att använda två R-funktioner för att bedöma attribut, nämligen names() och dim():

names(my_data_frame)
## [1] "sex"           "bloodpressure"

According to the output, the my_data_frame object has two name attributes, namely sex and bloodpressure. It follows that the names attribute of a data frame is simply the column (variable) names. You can change the column namnes by assigning the names with a new vector of names. We will replace sex with Gender and bloodpressure with Pressure. The new column names must appear in the order they appear in the data frame, like so:

Enligt utskriften har my_data_frame två namnattribut, nämligen sex och bloodpressure. Namnattribut för en data frame (tabell) är helt enkelt kolumnernas (variablernas) namn! Du kan ändra namnen på kolumnerna genom att tilldela namnen en ny vektor med namn. De nya kolumnnamnen måste anges i den ordning som de skall ersätta befintliga kolumnnamn. Nu ändrar vi sex till Gender och bloodpressure till Pressure.

# Tillskriv nya namn på kolumnerna
names(my_data_frame) <- c("Gender", "Pressure")

# Kontrollera namnen
names(my_data_frame)
## [1] "Gender"   "Pressure"

Man användner namn-attributet för att referera till kolumnerna i en data frame. Om du vill extrahera alla blodtrycksvärden från my_data_frame så använder du namn-attributet. Detta görs genom att använda namnet på din data frame, $ och namnet på kolumnen, så här:

my_data_frame$Pressure
## [1] 140 130 120 150

This way you can create a new variable using information stored in an existing variable. We will now create the variable new_variable, which is equal to Pressure divdied by 2:

Med samma princip kan du skapa en ny variabel som sparas i din data frame. Vi kommer nu att skapa variabeln new_variable, vilken skall vara hälften av blodtrycket:

my_data_frame$new_variable <- my_data_frame$Pressure/2

# Granska resultatet
my_data_frame
##   Gender Pressure new_variable
## 1    Man      140           70
## 2  Woman      130           65
## 3    Man      120           60
## 4  Woman      150           75

Dimensioner (dimensions)

Låt oss undersöka det andra attributet, nämligen dim(), som är förkortning för dimension. Den här funktionen granskar objektets dimensioner, dvs antalet rader och kolumner. Det första argumentet är antalet rader och det andra är antal kolumner.

dim(my_data_frame)
## [1] 4 3

Funktionen dim() returnerade talet 4 och 2, som representerar antalet rader respektive kolumner.

Du kan använda dim() för att skapa en n-dimensionell array från en atomvektor. Låt oss skapa en atomvektor med 6 nummer:

my_vector <- c(1, 2, 3, 4, 5, 6)

Låt oss ge vektorn my_vektor dimensionerna (2, 3) vilket är lika med 2 rader och 3 kolumner:

# Ändra dimensioner
dim(my_vector) <- c(2, 3)

# Granska dimensioner
dim(my_vector)
## [1] 2 3
# Se nya strukturen
my_vector
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6

Som du kan se fyller R upp kolumnerna först.

5/5 (1 Review)