Matematické operace v R
Aritmetické operace[upravit | editovat zdroj]
Aritmetické operace lze uskutečnit mezi dvěma (či více) hodnotami, ale i mezi dvěma (či více) vektory shodných délek.
Můžeme užít tzv. prefix notaci ve tvaru 'operátor'(…, …)
vhodnou pro dynamické iterování. Např. 2*3
zapíšeme jako '*'(2, 3)
.
Sčítání[upravit | editovat zdroj]
Sčítání provádíme znakem plus +
.
15 + 25 + 35
#> [1] 75
c(1, 2) + c(10, 20) # = c(11, 12)
#> [1] 11 12
'+'(2, 3) # 5
'+'(15, 25, 35) # Error: operator needs one or two arguments
'+'('+'(15, 25), 35) # 75
'+'(c(1, 2), c(10, 20)) # c(11, 22)
Odčítání[upravit | editovat zdroj]
Odčítání provádíme znakem minus -
.
35 - 25 - 15 # -5
c(12, 25) - c(3, 6) # c(9, 19)
'-'(12, 3) # 9
'-'(35, 25, 15) # Error: operator needs one or two arguments
'-'('-'(35, 25), 15) # -5
'-'(c(12, 25), c(3, 6)) # c(9, 19)
Násobení[upravit | editovat zdroj]
Násobení provádíme znakem hvězdičky *
.
35 * 25 * 15 # 13125
c(12, 25) * c(3, 6) # c(36, 150)
'*'(12, 3) # 36
'*'('*'(35, 25), 15) # 13125
'*'(c(12, 25), c(3, 6)) # c(36, 150)
Dělení[upravit | editovat zdroj]
Dělení provádíme znakem lomítka /
.
12 / 3 # 4
45 / 5 / 3 # 3
c(12, 25) / c(3, 5) # c(4, 5)
'/'(12, 3) # 4
'/'('/'(45, 5), 3) # 3
'/'(c(12, 25), c(3, 5)) # c(4, 5)
Mocnění[upravit | editovat zdroj]
Mocnění provádíme pomocí dvou hvězdiček **
nebo ^
.
2 ^ 3 # 8
2 ** 3 # 8; Python-like notace
4 ^ 3 ** 2 # 262144
4 ^ (3 ** 2) # 262144
(4 ^ 3) ** 2 # 4096; pozor na uzávorkování !!!
c(25, 36) ^ 0.5 # c(5, 6); odmocňování
c(5, 3) ^ c(2, 3) # c(25, 27)
c(5, 3) ** c(2, 3) # c(25, 27)
'^'(2, 3) # 8
'**'(2, 3) # Error: could not find function "**"
'^'(4, 3, 2) # Error: operator needs one or two arguments
'^'('^'(4, 3), 2) # 4096
'^'(c(5, 3), c(2, 3)) # c(25, 27)
Modulo[upravit | editovat zdroj]
Modulo vrací zbytek po celočíselném dělení. 20 modulo 6 je tedy 2 (20/6 je 3, zbytek 2). Modulo provádíme pomocí dvou znaků procent %%
.
12 %% 3 # 0
10 %% 3 # 1
10 %% -3 # -2
5 %% 0 # NaN
17 %% 23 # 17
Celočíselné dělení[upravit | editovat zdroj]
Někdy je potřeba dělit s celočíselným výsledkem. Vlastně je tato funkce doplňkem modula. Celočíselné dělení provádíme pomocí sekvence %/%
.
12 %/% 3 # 4
10 %/% 3 # 3
10 %/% -3 # -2
5 %/% 0 # ha, chyták, dělení nulou v R existuje! Vrací nekonečno (Inf).
17 %/% 23 # 0
23 %/% 17 # 1
17 %/% 5 # 3
(17 - 17 %% 5) / 5 # 3
(17 %/% 5) * 5 + (17 %% 5) # 17
Uživatelem definované operátory[upravit | editovat zdroj]
Můžeme si definovat vlastní operátory s názvem mezi dvěma znaky procent.
# definuji vlastní operátor
'%očaruj_pomocí%' <- function(x, y){x^2 + y}
5%očaruj_pomocí% 4 # 5 ˆ 2 + 4 = 29
6 %očaruj_pomocí% -3 # 6 ˆ 2 - 3 = 33
# definuji operátor, který vrací TRUE, právě když je první číslo celočíselným dělitelem druhého
'%d%' <- function(d, n){n %% d == 0}
3 %d% 9 # TRUE
4 %d% 9 # FALSE
'%d%'(7, 21) # TRUE; prefix notace
Logické operace[upravit | editovat zdroj]
Logické operace lze užít obecně nad výroky, tj. nad objekty s datovým typem logical.
Short AND (operátor "&") / OR (operátor "|")[upravit | editovat zdroj]
- Použitelná pro vektory
- Vyhodnocuje všechny výroky vektoru a vrací jejich hodnoty
c(FALSE, FALSE, TRUE, TRUE) & c(FALSE, TRUE, FALSE, TRUE) # c(FALSE, FALSE, FALSE, TRUE)
c(FALSE, FALSE, TRUE, TRUE) | c(FALSE, TRUE, FALSE, TRUE) # c(FALSE, TRUE, TRUE, TRUE)
Long AND (operátor "&&") / OR (operátor "||")[upravit | editovat zdroj]
- Použitelná také pro vektory
- Vyhodnocuje pouze nutný počet výroků (možná optimalizace) a vrací jen jednu hodnotu
c(FALSE, FALSE, TRUE, TRUE) && c(FALSE, TRUE, FALSE, TRUE) # FALSE
c(FALSE, FALSE, TRUE, TRUE) || c(FALSE, TRUE, FALSE, TRUE) # FALSE, protože první dvojice vrací FALSE
XOR (funkce xor(), vylučovací OR)[upravit | editovat zdroj]
xor(c(FALSE, FALSE, TRUE, TRUE), c(FALSE, TRUE, FALSE, TRUE)) # c(FALSE, TRUE, TRUE, FALSE)
NOT (operátor "!")[upravit | editovat zdroj]
Vrací výroku opačnou logickou hodnotu, než které výrok nabývá
! TRUE # FALSE
! 2 > 3 # TRUE
Funkce all()[upravit | editovat zdroj]
Vrací pro vektor výroků TRUE právě tehdy, jsou-li všechny výroky rovné TRUE
all(c(3 > 2, 7 %% 3 == 1, 1 == 0)) # FALSE
all(c(3 > 2, 7 %% 3 == 1, 1 >= 0)) # TRUE
Funkce any()[upravit | editovat zdroj]
Vrací pro vektor výroků TRUE právě tehdy, je-li alespoň jeden z výroků roven TRUE
any(c(3 < 2, 7 %% 3 <= 0, FALSE)) # FALSE
any(c(3 > 2, 7 %% 3 >= 1, !FALSE)) # TRUE
Operace porovnávání (komparace)[upravit | editovat zdroj]
- Pomocí operací porovnávání lze srovnat velikost či pořadí dvou objektů stejného datového typu
- Datový typ může přitom být v podstatě libovolný
- Výsledkem operace porovnání je výrok (logical)
2 == 3 # FALSE
'=='("a", "a") # TRUE; prefix notace
all.equal(c(1, 2), c(1, 2 + 1e-13), tolerance = 1e-12) # TRUE; porovnává vektory volitelnou danou tolerancí
identical(c(1, 2), c(1, 2 + 1e-13)) # FALSE, porovnává objekty a vrací TRUE jen při úplné # shodě
2 < 3 # TRUE
"b" <= "a" # FALSE; porovnává pořadí v abecedě
'>'(12, 11) # TRUE; prefix notace
FALSE >= TRUE # FALSE; porovnává hodnotu v booelovské aritmetice (TRUE := 1, FALSE := 0)
2 != 3 # TRUE
TRUE != FALSE # TRUE
'!='(FALSE, FALSE) # FALSE; prefix notace
Porovnání typu je obsaženo ve (%in%)
c(2, 6) %in% c(1:5) # c(TRUE, FALSE)
"k" %in% LETTERS # FALSE
"J" %in% letters # FALSE
"May" %in% month.name # TRUE
'%in%'("Jan", month.abb) # TRUE; prefix notace
"a" %in% "abeceda" # FALSE
Ekvivalentem (wrapperem) operace %in% je funkce is.element()
is.element(c(2, 6), c(1:5)) # c(TRUE, FALSE)
is.element(c(1:5), c(2, 6)) # c(FALSE, TRUE, FALSE, FALSE, FALSE)
Funkce typu je pravdou (isTRUE())
isTRUE(3^2 > 2^3) # TRUE
Množinové operace[upravit | editovat zdroj]
Sjednocení množin
union(c(1, 2, 3), c(5, 1)) # c(1, 2, 3, 5)
Průnik množin
intersect(c(1, 2, 3), c(5, 1)) # c(1)
Asymetrický rozdíl množin
setdiff(c(1, 2, 3), c(5, 1)) # c(2, 3)
Symetrický rozdíl množin
union(setdiff(c(1, 2, 3), c(5, 1)), setdiff(c(5, 1), c(1, 2, 3))) # c(2, 3, 5)
Jsou si množiny rovny
setequal(c(1, 2, 3), c(5, 1)) # FALSE
setequal(c(1, 2, 3), c(3, 2, 1)) # TRUE
Zaokrouhlování, formátování čísel[upravit | editovat zdroj]
Zaokrouhlení čísla x pomocí round(x, digits) na digits desetinných míst
round(1.4, digits = 0) # 1
round(-146.655, 2) # -146.66
Zaokrouhlení čísla x pomocí signif(x, digits) na digits platných cifer
signif(1.458, digits = 1) # 1
signif(1.458, digits = 2) # 1.5
signif(1.458, digits = 3) # 1.46
signif(1.458, digits = 4) # 1.458
Formátování čísla x pomocí format(x, nsmall) na nsmall fixních desetinných cifer
format(1.45, nsmall = 1) # "1.45"
format(1.45, nsmall = 2) # "1.45"
format(1.45, nsmall = 3) # "1.450"
Konstanty[upravit | editovat zdroj]
Některé matematické a textové konstanty jsou součástí jádra, např.
pi # 3.141593; Ludolfovo číslo
exp(1) # 2.718282; Eulerovo číslo
Inf # nekonečno
-Inf # mínus nekonečno
letters # malá písmena anglické abecedy
LETTERS # velká písmena anglické abecedy
month.name # názvy měsíců
month.abb # zkratky názvů měsíců
weekdays(Sys.Date()) # vrátí aktuální den v týdnu
weekdays(seq(as.Date("2017-10-23"), as.Date("2017-10-29"), 1)) # vypíše názvy dnů v týdnu
Fyzikální konstanty jsou dostupné v balíčku constants