2.4 Logiske variabler og vektorer

R kan tjekke bestemte udsagn om tal, såsom “fem er mindre end tre”. Hvis man skriver udsagnet, får man sandhedsværdien tilbage, som er enten TRUE eller FALSE:

5 < 3
## [1] FALSE

Følgende relationer til sammenligning af to tal findes i R:

Relation Betydning
< \(<\) skarp mindre end
<= \(\leq\) mindre end eller lig med
> \(>\) skarp større end
>= \(\geq\) større end eller lig med
== \(=\) lig med
!= \(\neq\) forskellig fra

Man kan sammenligne to tal, eller også en vektor og en tal eller to vektorer.

2 <= 3
## [1] TRUE
2 >= c(3, -1, 5, 2)
## [1] FALSE  TRUE FALSE  TRUE
c(1, 2, 3) != c(1, 4, 3)
## [1] FALSE  TRUE FALSE

Logiske variabler gemmer sandhedsværdier.

Logiske værdier kan kombineres ved “og” eller “eller” operatorer og negationen. Antag, vi har gemt logiske værdier i variablerx og y, så betyder

Operator Betydning
!x \(\neg x\), negationen
x & y \(x\wedge y\), og
x | y \(x\vee y\), eller
xor(x,y) enten \(x\) eller \(y\).

For eksempel kan bestemmes, om \(1 \leq x\), \(x \leq 5\) og \(1 \leq x \leq 5\) gælder når \(x\) antager værdierne \(0, 2.3\) og \(6\) ved følgende kode:

x <- c(0, 2.3, 6)
1 <= x
## [1] FALSE  TRUE  TRUE
x <= 5
## [1]  TRUE  TRUE FALSE
(1 <= x) & (x <= 5)
## [1] FALSE  TRUE FALSE

Skal resultatet gemmes, så bruges med fordel parenteser for at øge kodens læselighed. I nedenstående eksempel bruges et langt navn. Det er tilladt at bruge underscores og punktum i variablenavne, men ikke bindestreg, fordi dette ville interpreteres som “minus”.

x_ligger_i_intervallet <- ((1 <= x) & (x <= 5))
x_ligger_i_intervallet
## [1] FALSE  TRUE FALSE

Internt bliver de koderet som 1 og 0, hvor 1 står for TRUE. Man kan regne med dem som om de var tal.

LoGo <- c(TRUE, FALSE, TRUE)
LoGo
## [1]  TRUE FALSE  TRUE
sum(LoGo)
## [1] 2

Øvelse 2.8

Gem en vektor \(a = (-3, 7, -2 ,10)\) og bestem ved at beregne i R, hvor mange af af \(a\)s elementer

  • er større end -2.5,
  • er mindre end 9,
  • ligger mellem -2.5 og 9,
  • ligger uden for intervallet \([-2.5,9]\).

2.4.1 Indeksering af vektorer ved logiske udtryk eller logiske variable

I afsnit 2.3.1 så vi, hvordan man trækker flere elementer i en vektor ved at give indeksnumre. Det er faktisk muligt, at bruge en vektor af logiske værdier som indeks, hvor der angives, hvilke elementer skal beholdes.

a <- c(-4, 3, 7, -1, 6, -5, 10.3, round(pi, digits = 2))
positiv <- a > 0
positiv
## [1] FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE
a[positiv]
## [1]  3.00  7.00  6.00 10.30  3.14
a[a > 0]
## [1]  3.00  7.00  6.00 10.30  3.14

Øvelse 2.9

Forklar ovenstående kode, og lav en ny vektor smaa som indeholder alle elementer af a der er mindre eller lig fire.