Datatyper i R med eksempel

โšก Smart opsummering

Datatyper i R definerer, hvordan vรฆrdier gemmes i hukommelsen, og operatorer bestemmer, hvad R kan gรธre med dem. Vektorer, variabler, aritmetiske, relationelle, logiske og tildelingsoperatorer dรฆkkes her med eksempler, der kan kรธres.

  • ๐Ÿ”˜ Atomic-typer: R gemmer alle vรฆrdier som logiske, heltal, dobbelte, komplekse, tegn- eller rรฅvรฆrdier.
  • โ˜‘๏ธ Typekontrol: class(), typeof() og mode() beskriver en vรฆrdi fra tre forskellige vinkler.
  • โœ… Vektorer: Funktionen c() opbygger en endimensionel samling, hvor hvert element deler รฉn type.
  • ๐Ÿงช Operators: Aritmetiske, relationelle, logiske og tildelingsoperatorer dรฆkker nรฆsten alle basis-R-udtryk.
  • ๐Ÿ› ๏ธ Delmรฆngde: Firkantede parenteser kombineret med en logisk betingelse filtrerer vektorelementer pรฅ en enkelt linje.
  • โš ๏ธ Versionsnotat: R 4.3.0 forvandlede et argument med en lรฆngde pรฅ mere end รฉn til && eller || til en fejl.

Datatyper i R

Hvad er datatyperne i R?

Fรธlgende er datatyperne eller datastrukturerne i R-programmering:

Den liste blander to relaterede idรฉer, og ved at adskille dem bliver resten af โ€‹โ€‹siden lettere at fรธlge. datatype beskriver, hvad en enkelt vรฆrdi er โ€” et tal, et stykke tekst, en SAND eller en FALSK. En datastruktur beskriver, hvor mange vรฆrdier der holdes sammen, og i hvilken form. Skalarer, vektorer, matricer, datarammer og lister er strukturer; vรฆrdierne i dem tilhรธrer stadig en af โ€‹โ€‹R's grundtyper.

Struktur Mรฅl Blandede typer tilladt? Typisk brug
Skalar Lรฆngde-1 vektor Ingen En enkelt mรฅling eller et flag
vektor 1 Ingen En kolonne med aflรฆsninger af รฉn type
Matrix 2 Ingen Numeriske gitre og lineรฆr algebra
Dataramme 2 Ja, รฉn type pr. kolonne Tabeldatasรฆt
Liste 1, men kan indbygges Ja, alt pr. element Modelresultater og blandede containere

R har ingen separat skalartype: en skalar er simpelthen en vektor med lรฆngden รฉn, hvilket er grunden til, at sรฅ meget R-kode skrives for hele vektorer pรฅ รฉn gang.

Grundlรฆggende datatyper i R

Enhver vรฆrdi i R tilhรธrer en af โ€‹โ€‹et lille sรฆt af grundlรฆggende (atomare) typer:

  • 4.5 er en decimalvรฆrdi kaldet numerisk.
  • 4 ligner et helt tal, men R gemmer det stadig som et dobbelttal. Skriv 4L, nรฅr et รฆgte heltal er pรฅkrรฆvet.
  • SAND eller FALSK er en boolsk vรฆrdi, kaldet en logisk vรฆrdi i R.
  • Vรฆrdien i " " eller ' ' er tekst (en streng). Disse vรฆrdier kaldes tegn.

To yderligere typer fuldender sรฆttet. Komplekse vรฆrdier som 3+2i indeholder en reel og en imaginรฆr del, og rรฅ vรฆrdier indeholder bytes. Begge optrรฆder sjรฆldent i daglig analyse, men de er angivet i basis-R. typeof() dokumentation sammen med de fire almindelige typer.

Type Eksempelvรฆrdi class() returnerer typeof() returnerer
Logisk TRUE logisk logisk
Integer 4L heltal heltal
Double (numerisk) 4.5 numerisk fordoble
Character "R er fantastisk" karakter karakter
Complex 3+2i komplekse komplekse
Raw som.raw(10) rรฅ rรฅ

Vi kan kontrollere typen af โ€‹โ€‹en variabel med klassefunktionen.

Eksempel 1: Tjek en numerisk variabel

# Declare variables of different types
# Numeric
x <- 28
class(x)

Output:

## [1] "numeric"

Eksempel 2: Tjek en tegnvariabel

# String
y <- "R is Fantastic"
class(y)

Output:

## [1] "character"

Eksempel 3: Tjek en logisk variabel

# Boolean
z <- TRUE
class(z)

Output:

## [1] "logical"

Bemรฆrk at class() svarer "numerisk" for 28, selvom 28 ikke har nogen decimaldel. R gemte det som en double, og kun typeof() afslรธrer det. Den nรฆste forskel, der er vรฆrd at lรฆre, er, hvordan disse vรฆrdier fรฅr navne.

Variabler i R

Variabler er en af โ€‹โ€‹de grundlรฆggende byggesten i R, der lagrer vรฆrdier, og de er vigtige for alle, der arbejder med datalogi. En variabel i R kan lagre et tal, et objekt, et statistisk resultat, en vektor, et datasรฆt eller en modelforudsigelse โ€“ stort set alt, hvad R udskriver. Vi kan bruge den variabel senere ved blot at kalde navnet pรฅ variablen.

For at deklarere en variabel i R, skal vi tildele den et variabelnavn. Navnet mรฅ ikke indeholde mellemrum. Vi kan bruge _ til at forbinde to ord.

Navne kan indeholde bogstaver, cifre, prikker og understregninger, men de skal starte med et bogstav eller et punktum, og reserverede ord som TRUE, FALSE og NULL kan ikke bruges som navne. For at tilfรธje en vรฆrdi til variablen skal du bruge <- eller =.

Her er syntaksen:

# First way to declare a variable:  use the `<-`
name_of_variable <- value
# Second way to declare a variable:  use the `=`
name_of_variable = value

Pรฅ kommandolinjen kan vi skrive fรธlgende koder for at se, hvad der sker:

Eksempel 1: Tildel en vรฆrdi og udskriv den

# Print variable x
x <- 42
x

Output:

## [1] 42

Eksempel 2: Deklarer en anden variabel

y  <- 10
y

Output:

## [1] 10

Eksempel 3: Brug to variabler i รฉt udtryk

# We call x and y and apply a subtraction
x-y

Output:

## [1] 32

En variabel, der indeholder flere vรฆrdier af samme type, er en vektor, som er den struktur, som nรฆsten alle R-funktioner forventer.

Vektorer i R

En vektor er en endimensionel samling, hvor hvert element deler den samme type. Vi kan oprette en vektor med alle de grundlรฆggende R-datatyper, som vi har lรฆrt tidligere. Den enkleste mรฅde at opbygge en vektor i R pรฅ er at bruge c()-funktionen.

Eksempel 1: Opret en numerisk vektor

# Numerical
vec_num <- c(1, 10, 49)
vec_num

Output:

## [1]  1 10 49

Eksempel 2: Opret en tegnvektor

# Character 
vec_chr <- c("a", "b", "c")
vec_chr

Output:

## [1] "a" "b" "c"

Eksempel 3: Opret en logisk vektor

# Boolean 
vec_bool <-  c(TRUE, FALSE, TRUE)
vec_bool

Output:

##[1] TRUE FALSE TRUE

Hvis c() modtager en blanding af typer, fejler den ikke. Den tvinger stille og roligt hvert element op til den mest generelle type, der findes, sรฅ c(1, "a", TRUE) bliver en tegnvektor. Vi kan ogsรฅ udfรธre aritmetiske beregninger pรฅ vektorer i R.

Eksempel 4: Lรฆg to vektorer element for element sammen

# Create the vectors
vect_1 <- c(1, 3, 5)
vect_2 <- c(2, 4, 6)
# Take the sum of A_vector and B_vector
sum_vect <- vect_1 + vect_2
# Print out total_vector
sum_vect

Output:

[1]  3  7 11

Additionen fungerede element for element, fordi begge vektorer har samme lรฆngde. Nรฅr lรฆngderne er forskellige, genbruger R den kortere vektor, gentager den, indtil den matcher den lรฆngste, og advarer kun, nรฅr den lรฆngere lรฆngde ikke er et multiplum af den kortere.

Eksempel 5: Opdel de fรธrste fem elementer

I R er det muligt at skรฆre en vektor. I nogle tilfรฆlde er vi kun interesserede i de fรธrste fem elementer i en vektor. Vi kan bruge kommandoen [1:5] til at f.eks.tracvรฆrdierne 1 til 5.

# Slice the first five rows of the vector
slice_vector <- c(1,2,3,4,5,6,7,8,9,10)
slice_vector[1:5]

Output:

## [1] 1 2 3 4 5

Eksempel 6: Opbyg et interval med kolon OperaTor

Den korteste mรฅde at oprette et vรฆrdiinterval pรฅ er at bruge kolonoperatoren (:) mellem to tal. For eksempel kan vi fra ovenstรฅende eksempel skrive c(1:10) for at oprette en vektor af vรฆrdier fra et til ti.

# Faster way to create adjacent values
c(1:10)

Output:

## [1]  1  2  3  4  5  6  7  8  9 10

Fordi en vektor lydlรธst รฆndrer type, nรฅr den blandes, er det en god idรฉ at vide, hvordan man inspicerer og konverterer typer efter behov.

Sรฅdan kontrollerer og konverterer du datatyper i R

Tre funktionsfamilier besvarer de tre spรธrgsmรฅl, der konstant dukker op: hvad er dette, er dette en given type, og kan dette blive til en anden type.

Funktionsfamilie Spรธrgsmรฅl det besvarer Eksempler
klasse(), typeof(), mode() Hvilken type er denne vรฆrdi? klasse(28), type(28), tilstand(28)
er.*() Er denne vรฆrdi af typen X? is.numeric(), is.character(), is.logical()
som.*() Kan denne vรฆrdi blive til type X? som.numerisk(), som.character(), som.integer()
str() Hvordan ser dette objekt ud overordnet set? str(vec_num)
# Three different views of the same value
x <- 28
class(x)      # "numeric"  -- the class used for method dispatch
typeof(x)     # "double"   -- how R stores the value internally
mode(x)       # "numeric"  -- the older S-style mode

# Ask a yes/no question about a type
is.numeric(x)     # TRUE
is.character(x)   # FALSE

# Convert between types
as.character(x)   # "28"
as.integer("28")  # 28 stored as an integer
as.numeric("abc") # NA, with a coercion warning

To regler forklarer de fleste overraskelser her. For det fรธrste rapporterer class() den klasse, der bruges til metodeafsendelse, mens typeof() rapporterer den interne lagring, hvilket er grunden til, at 28 er "numerisk" for den ene og "dobbelt" for den anden. For det andet stopper en konvertering, der ikke kan lykkes, ikke scriptet: as.numeric("abc") returnerer NA og udskriver en tvangsadvarsel, sรฅ tavse NA'er efter en import er nรฆsten altid et typeproblem. Den samme logik driver faktorer, som gemmer kategorier som heltalskoder plus en tabel over niveauer.

Nรฅr typerne er afgjort, er det de nรฆste operatorer, der handler pรฅ dem.

R Aritmetik Operatorer

Vi vil fรธrst se pรฅ de grundlรฆggende aritmetiske operatorer i R. Fรธlgende er de aritmetiske operatorer i R-programmering og hvad de stรฅr for:

OperaTor Beskrivelse
+ Tilsรฆtning
- Undertraction
* Multiplikation
/ Afdeling
^ eller ** eksponentiering
%% Modulo (resten efter division)
%/% Heltalsdivision (kvotient, rest kasseret)

Hver af disse operatorer er vektoriseret, sรฅ det samme udtryk fungerer pรฅ en enkelt vรฆrdi eller pรฅ en hel kolonne.

Eksempel 1: Addition

# An addition
3 + 4

Output:

## [1] 7

Du kan nemt kopiere og indsรฆtte ovenstรฅende R-kode i RStudio Konsol. I denne artikel vises outputtet pรฅ linjer, der starter med ##. Hvis vi f.eks. skriver koden print("Guru99") konsollen udskriver [1] "Guru99", som denne side ville vise som ## [1] "Guru99".

## markerer en linje med udskrevet output, og tallet i den firkantede parentes ([1]) er indekset for den fรธrste vรฆrdi pรฅ den linje, ikke en del af resultatet.

Sรฆtninger, der starter med #, er kommentarer. Vi kan bruge # i et R-script til at tilfรธje en hvilken som helst note, og R ignorerer det under kรธrsel.

Eksempel 2: Multiplikation

# A multiplication
3*5

Output:

## [1] 15

Eksempel 3: Division

# A division
(5+5)/2

Output:

## [1] 5

Eksempel 4: Eksponentiering

# Exponentiation
2^5

Output:

## [1] 32

Eksempel 5: Modulo

# Modulo
28%%6

Output:

## [1] 4

Aritmetik producerer tal. Den nรฆste gruppe operatorer producerer i stedet SAND og FALSK.

R Relationel (Sammenligning) Operatorer

Relationsoperatorer sammenligner to vรฆrdier og returnerer et logisk resultat. Det er de operatorer, der opbygger de betingelser, der bruges til filtrering, og de vektoriseres pรฅ prรฆcis samme mรฅde som de aritmetiske operatorer.

OperaTor Beskrivelse
> Stรธrre end
< Less end
>= Stรธrre end eller lig med
<= Less end eller lig med
== Prรฆcis lig med
!= Ikke lig med
a <- 10
b <- 3

a > b     # TRUE
a < b     # FALSE
a >= 10   # TRUE
a <= 3    # FALSE
a == b    # FALSE
a != b    # TRUE

# Relational operators are vectorised
scores <- c(45, 78, 90, 62)
scores >= 60   # FALSE TRUE TRUE TRUE

To vaner sparer tid her. Brug == til sammenligning og <- til tildeling, fordi en enkelt = i en betingelse er en almindelig begynderfejl. Og undgรฅ == pรฅ doubles: flydende-komma-afrunding betyder, at 0.1 + 0.2 == 0.3 er FALSK, sรฅ isTRUE(all.equal(0.1 + 0.2, 0.3)) er den sikre test. Sammenligninger pรฅ sorterede datarammer fรธlge de samme regler.

R Logisk Operatorer

Med logiske operatorer รธnsker vi at returnere vรฆrdier inden for vektoren baseret pรฅ logiske betingelser. Tabellen nedenfor viser de logiske operatorer, der er tilgรฆngelige i R.

Referencetabel over logiske og relationelle operatorer i R med deres betydninger

De logiske udsagn i R er pakket ind i []. Vi kan tilfรธje sรฅ mange betingede udsagn, som vi รธnsker, men vi skal inkludere dem i parenteser. Vi kan fรธlge denne struktur for at oprette en betinget udsagn:

variable_name[(conditional_statement)]

Med variable_name som refererer til den variabel, vi vil bruge til sรฆtningen, opretter vi den logiske sรฆtning, for eksempel variable_name > 0. Til sidst bruger vi de firkantede parenteser til at fรฆrdiggรธre den logiske sรฆtning. Nedenfor er et eksempel pรฅ en logisk sรฆtning.

Eksempel 1: Sammenlign alle elementer i en vektor

# Create a vector from 1 to 10
logical_vector <- c(1:10)
logical_vector>5

Output:

## [1]FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE

I outputtet ovenfor lรฆser R hver vรฆrdi og sammenligner den med sรฆtningen logical_vector>5. Hvis vรฆrdien er strengt taget stรธrre end fem, er betingelsen SAND, ellers FALSK. R returnerer en vektor af SAND og FALSK.

Eksempel 2: Behold kun de elementer, der matcher

I eksemplet nedenfor รธnsker vi at f.eks.tracde vรฆrdier, der kun opfylder betingelsen 'er strengt taget stรธrre end fem'. For at gรธre dette kan vi omslutte betingelsen i firkantede parenteser efterfulgt af vektoren, der indeholder vรฆrdierne.

# Print value strictly above 5
logical_vector[(logical_vector>5)]

Output:

## [1]  6  7  8  9 10

Eksempel 3: Kombinรฉr to betingelser

# Print 5 and 6
logical_vector <- c(1:10)
logical_vector[(logical_vector>4) & (logical_vector<7)]

Output:

## [1] 5 6

Eksempel 3 bruger det enkelte og-tegnet & med vilje. Enkelttegnsoperatorerne & og | sammenligner vektorer element for element og returnerer en vektor, hvilket er, hvad delmรฆngder har brug for. Dobbeltformerne && og || returnerer รฉn vรฆrdi og hรธrer hjemme i if()- og while()-betingelserne. Da R 4.3.0, at sende et argument, der er lรฆngere end รฉt element, til && eller || er en fejl snarere end en advarsel, sรฅ de to familier er ikke lรฆngere udskiftelige. !-operatoren negerer en betingelse, og xor() giver eksklusiv ELLER.

R-tildeling Operatorer

Tildelingsoperatorer binder en vรฆrdi til et navn. R tilbyder flere af dem end de fleste sprog, og forskellene betyder noget, nรฅr koden flyttes ind i funktioner.

OperaTor Beskrivelse
<- Venstretildeling, det idiomatiske valg i R
= Venstre tildeling, men normalt reserveret til funktionsargumenter
-> Korrekt tildeling, gyldig men sjรฆldent brugt
<<- Supertildeling, der sรธger i omsluttende miljรธer
- >> Hรธjre supertildeling
# Left assignment -- the idiomatic form
count <- 5

# Equals sign: works, but reserve it for function arguments
count = 5
round(3.14159, digits = 2)

# Right assignment
5 -> count

# Superassignment, used inside functions to reach an outer scope
count <<- 5

Stilguider anbefaler <- til oprettelse af objekter og = til navngivning af argumenter i et kald, fordi de to roller sรฅ forbliver visuelt adskilte. Brug <<- sparsomt: det รฆndrer et objekt uden for den aktuelle funktion og gรธr det svรฆrere at rรฆsonnere om kode. Nรฅr tildeling og typer er komfortable, er de nรฆste trin: import af reelle data og reshaping det med dplyr; det Oversigt over R-sproget sรฆtter hele vรฆrktรธjskรฆden i kontekst.

Ofte Stillede Spรธrgsmรฅl

En vektor indeholder kun elementer af รฉn type, og blanding af typer tvinger frem tvang. En liste indeholder alt i hvert slot, inklusive andre lister, datarammer eller funktioner, hvilket er grunden til, at modelobjekter er lister.

Nรฅr to vektorer med forskellig lรฆngde mรธder en operator, gentager R den korteste, indtil lรฆngderne stemmer overens. c(1,2,3,4) + c(1,2) giver 2 4 4 6. En advarsel vises kun, nรฅr den lรฆngere lรฆngde ikke er et multiplum.

NA markerer en manglende vรฆrdi i en vektor. NULL markerer fravรฆret af et objekt og har en lรฆngde pรฅ nul. NaN er et udefineret numerisk resultat, f.eks. 0/0. Inf er division med nul, f.eks. 1/0.

Operatoren %in% tester medlemskab og returnerer TRUE for hvert venstre element, der findes i hรธjre vektor. c(2,7) %in% c(1,2,3) returnerer TRUE FALSE. Den erstatter lange kรฆder af == sammenligninger forbundet med |.

Vรฆlg et matrix for numeriske gitre og lineรฆr algebra, en dataramme for tabeller, hvis kolonner er forskellige i type, og en liste nรฅr elementer har forskellige former.

Introduceret i R 4.1.0, sender |> vรฆrdien til venstre ind i funktionen til hรธjre. Den kรฆder trin sammen uden at indlejre kald og behรธver ingen pakke, i modsรฆtning til magrittr %>% pipe-funktionen.

AI-assistenter markerer typeuoverensstemmelser, foreslรฅr as.*-konverteringer og udarbejder omkodningskode fra en stikprรธve af rรฆkker. De foreslรฅr ogsรฅ trin til funktionsudvikling fรธr en machine learning modellen er monteret. Undersรธg altid den genererede kode mod dine data.

Ja. RStudio 2023.09.0 og senere sendes GitHub Copilot integration, der fuldfรธrer R-udtryk inline. Et Copilot-abonnement er pรฅkrรฆvet, og administratorer skal aktivere det pรฅ RStudio Server eller Posit Workbench.

Opsummer dette indlรฆg med: