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)

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: