Sunteți pe pagina 1din 18

Introducere ı̂n R

Puternic şi gratuit

Radu Trı̂mbiţaş

1 Cum lucrează R
Cum lucrează R
• La execuţia R, variabilele, datele, funcţiile, rezultatele, etc., sunt memo-
rate ı̂n memoria calculatorului sub formă de obiecte care au un nume.
• Utilizatorul poate executa acţiuni asupra acestor obiecte cu operatori (arit-
metici, logici, de comparaţie, . . . ) şi funcţii (care sunt la rândul lor obiecte).
Utilizarea operatorilor este relativ intuitivă. O funcţie R poate fi schiţată
astfel:

• Argumentele pot fi obiecte (”date”, formule, expresii, . . . ), care pot fi de-


finite implicit ı̂n funcţii; aceste valori implicite pot fi modificate de utili-
zator specificând opţiuni.
• O funcţie R poate să nu aibă nici un argument: fie toate argumentele sunt
definite implicit (şi valorile lor pot fi modificate prin opţiuni), fie nici un
argument nu este definit ı̂n funcţie.

Cum lucrează R - continuare


• Toate acţiunile R se realizează pe obiecte memorate ı̂n memoria calcula-
torului: nu se utilizează fişiere temporare (Figura 1). Citirile şi scrierile
din fişiere sunt folosite pentru introducerea şi extragerea datelor şi rezul-
tatelor (grafice...).
• Utilizatorul execută funcţii prin anumite comenzi. Rezultatele sunt afişate
pe ecran, memorate ı̂ntr-un obiect, sau scrise pe disc (ı̂n particular pentru
grafice). Deoarece rezultatele sunt ele ı̂nsele obiecte, pot fi considerate
date şi analizate şi prelucrate ca atare.

1
• Fişierele de date pot fi citite de pe discuri locale sau de pe servere prin
internet.
• Funcţiile disponibile utilizatorului sunt memorate ı̂ntr-o bibliotecă loca-
lizată pe disc, ı̂n directorul R HOME/library (R HOME este directorul
unde R este instalat).

• Acest director conţine pachete de funcţii, care la rândul lor sunt structu-
rate ı̂n directori. Pachetul numit base este ı̂ntr-un anumit sens nucleul
lui R şi conţine funcţiile de bază ale limbajului, ı̂n particular cele pen-
tru citirea şi prelucrarea datelor. Fiecare pachet are un director numit R,
cu un fişier cu acelaşi nume ca pachetul (de exemplu, pentru pachetul
base, fişierul R HOME/library/base/R/base). Acest fişier conţine toate
funcţiile pachetului.

Figura 1: O vedere schematică a modului de lucru al R.

2 Esenţa limbajului R
2.1 Expresii, obiecte şi funcţii
Expresii şi obiecte

• Modul de bază de interacţiune al R este prin evaluarea expresiei. Utilizato-


rul introduce expresia; sistemul o evaluează şi afişează rezultatul. Anu-
mite expresii sunt evaluate nu pentru rezultat, ci pentru efecte colaterale
(grafice sau scriere ı̂n fişier).
• Orice expresie R returnează o valoare (posibil NULL), dar uneori ea este
“invizibil㔺i nu este tipărită.

2
• Expresiile presupun, de regulă, referinţe la variabile, operatori ca +, ape-
luri de funcţii şi alte elemente care vor fi introduse ı̂n continuare.
• Expresiile lucrează pe obiecte. Obiect desemnează orice poate fi atribuit
unei variabile. R are mai multe tipuri de obiecte (ex:vectori numerici).

Funcţii şi argumente

• Multe se realizează ı̂n R prin apeluri de funcţie, comenzi care arată ca o


aplicare a unei funcţii matematice uneia sau amai multor variabile; de
exemplu, log(x) sau plot(height, weight).
• Formatul este un nume de funcţie urmat de un set de paranteze ce conţine
unul sau mai multe argumente; De exemplu ı̂n plot(height,weight)numele
de funcţie este plot iar argumentele sunt height şi weight.
• Acestea sunt argumente actuale, care se aplică numai ı̂n apelul curent. O
funcţie are şi argumente formale, care sunt legate de argumentele actuale
la apel.
• Când introduceţi plot(height, weight), R consideră că primul argu-
ment corespunde variabilei x şi al doilea lui y – positional matching, potri-
vire poziţională.
• Funcţia plot este un exemplu de funcţie care admite o gamă largă de
argumente pentru a modifica simboluri, grosimi de linii, tipuri de axe
ş.a.m.d. Vom utiliza forme alternative de a specifica argumentele, de
exemplu pentru a alege ca simbol de afişare triunghiul, plot(height,
weight, pch=2).
• Forma pch=2 se numeşte transmitere prin nume, Cuvântul cheie pch se
utilizează pentru a indica că argumentul este o specificare a caracterului
simbol de afişare.
• Acest tip de argumente poate fi specificat ı̂ntr-o ordine arbitrară. Astfel,
plot(y=weight,x=height) este echivalent cu plot(x=height,y=weight).
• Cele două tipuri de specificare de argumente — poziţional şi cu nume —
pot fi combinate ı̂n acelaşi apel.
• Argumentele formale ale unei funcţii sunt parte a definiţiei funcţiei. Mulţimea
argumentelor formale ale unei funcţii se poate vizualiza cu args.

Exemple

>args(plot)
function (x, y, ...)
NULL
> args(plot.default)

3
function (x, y = NULL, type = "p", xlim = NULL,
ylim = NULL, log = "", main = NULL, sub = NULL,
xlab = NULL, ylab = NULL, ann = par("ann"),
axes = TRUE, frame.plot = axes, panel.first = NULL,
panel.last = NULL, asp = NA, ...)
NULL
> args(ls)
function(name, pos=-1L, envir = as.environment(pos),
all.names = FALSE, pattern, sorted = TRUE)
NULL

2.2 Vectori
Vectori
Funcţii pentru creare de vectori: c, seq, rep.
c - “concatenate”

> c(42,57,12,39,1,3,4)
[1] 42 57 12 39 1 3 4
> x <- c("Huey", "Dewey", "Louie"); x
[1] "Huey" "Dewey" "Louie"

Se pot concatena vectori cu mai mult de un element ca ı̂n


> x <- c(1, 2, 3)
> y <- c(10, 20)
> c(x, y, 5)
[1] 1 2 3 10 20 5
Este posibil să atribuim nume elementelor. Aceasta modifică modul ı̂n care un
vector este afişat.
> x <- c(red="Huey", blue="Dewey", green="Louie")
> x
red blue green
"Huey" "Dewey" "Louie"
Numele pot fi afişate sau setate utilizând names:
> names(x)
[1] "red" "blue" "green"
Toate elementele unui vector au acelaşi tip. Dacă se concatenează vectori de
tipuri diferite, ei vor fi convertiţi la tipul cel mai puţin ,,restrictiv”:
> c(FALSE, 3)
[1] 0 3
> c(pi, "abc")
[1] "3.14159265358979" "abc"

4
> c(FALSE, "abc")
[1] "FALSE" "abc"
> c(1.2, 2, TRUE, "gaga")
[1] "1.2" "2" "TRUE" "gaga"

Vectori - secvenţe
Funcţia seq (“sequence”) se utilizează pentru a genera serii echidistante de
numere.
> seq(4,9)
[1] 4 5 6 7 8 9
> 4:9
[1] 4 5 6 7 8 9
Dacă dorim un pas ̸= 1 scriem
> seq(4,16,2)
[1] 4 6 8 10 12 14 16
Echivalent seq(from=4, to=16, by=2).
Funcţia rep (“replicate”) se utilizează pentru a genera valori repetate; are
două variante, după cum al doilea argument este vector sau număr:
> oops <- c(7,9,13)
> rep(oops,3)
[1] 7 9 13 7 9 13 7 9 13
> rep(oops,1:3)
[1] 7 9 9 13 13 13
Funcţia rep se utilizează şi pentru a genera coduri pentru grupuri: dacă ştim
că primele 10 observaţii aparţin unor bărbaţi şi ultimele 15 unor femei, scriem
> rep(1:2,c(10,15))
[1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
Când avem număr egal de replicări se poate folosi each. E.g., rep(1:2,each=10)
este echivalent cu rep(1:2,c(10,10)).

Ghilimele şi secvenţe escape. Valori lipsă


R admite vectori ce conţin valoarea specială NA. Această valoare se propagă
ı̂n calcule, astfel că operaţiile asupra NA dau NA ca rezultat. is.na testează NA
> cat(c("Huey","Dewey","Louie"))
Huey Dewey Louie>
Pentru ca prompterul să apară pe linia următoare vom pune newline "\n"
> cat("Huey","Dewey","Louie", "\n")
Huey Dewey Louie
> cat("What is \"R\"?\n")
What is "R"?

5
Aici, \n este un exemplu de secvenţă escape. Ea reprezintă un singur caracter,
linefeed (LF), dar se introduce prin două caractere. Backslash \se numeşte es-
cape character.

2.3 Matrice şi tablouri


Matrice şi tablouri
În R, noţiunea de matrice se extinde la elemente de orice tip, putând avea,
de exemplu, matrice de şiruri de caractere. Matricele şi tablourile se reprezintă
ca vectori cu dimensiuni:
> x <- 1:12
> dim(x) <- c(3,4)
> x
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
Funcţia dim setează sau modifică atributul dimension al lui x, făcând R să trateze
vectorul de 12 numere ca o matrice 3 × 4. De notat că memorarea se face pe
coloane, adică elementele din prima coloană sunt urmate de cele din a doua,
etc.
Un mod convenabil de a crea matrice este utilizarea funcţiei matrix:
> matrix(1:12,nrow=3,byrow=T)
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 10 11 12
Observaţi că argumentul byrow=T cauzează memorarea matricei pe linii, nu ı̂n
modul implicit pe coloane.
Dintre funcţiile care operează pe matrice amintim rownames, colnames, şi
transpunerea t (t mic spre deosebire de T mare pentru TRUE):
> x <- matrix(1:12,nrow=3,byrow=T)
> rownames(x) <- LETTERS[1:3]
> x
[,1] [,2] [,3] [,4]
A 1 2 3 4
B 5 6 7 8
C 9 10 11 12
> t(x)
A B C
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12

6
Se pot concatena vectori pe linie sau pe coloane, utilizând funcţiile cbind şi
rbind.
> cbind(A=1:4,B=5:8,C=9:12)
A B C
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12
> rbind(A=1:4,B=5:8,C=9:12)
[,1] [,2] [,3] [,4]
A 1 2 3 4
B 5 6 7 8
C 9 10 11 12
O modalitate mai generală de a memora date este tabloul array. Tablourile pot
avea mai mulţi indici şi se pot crea cu funcţia array:

> a <- array(1:24, c(3, 4, 2))


> a
, , 1

[,1] [,2] [,3] [,4]


[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12

, , 2

[,1] [,2] [,3] [,4]


[1,] 13 16 19 22
[2,] 14 17 20 23
[3,] 15 18 21 24
De notat că dimensiunile se dau printr-un vector c(3, 4, 2). Când inserăm
date, primul indice variază cel mai repede, după ce şi-a parcurs domeniul, va-
riază al doilea, etc.

2.4 Factori
Factori

• În statistică este o practică comună să avem variabile categoriale, care in-
dică o anumită subdivizare a datelor, cum ar fi clasa socială, diagnosticul
primar, stadiul tumorii, etc. De regulă, acestea se introduc utilizând un
cod numeric.

7
• Astfel de variabile se specifică ı̂n R ca factori. Factorul este o structură
de date care (printre alte lucruri) ne permite să atribuim nume cu sens
categoriilor.
• Sunt analize ı̂n care este esenţial pentru R să facă distincţie ı̂ntre codu-
rile de categorii şi variabilele ale căror valori au o semnificaţie numerică
directă.
• Terminologia este că un factor are o mulţime de niveluri. Intern, un factor
cu k niveluri constă din două elemente: (a) un vector de ı̂ntregi ı̂ntre 1 şi
k şi (b) un vector de şiruri caractere de lungime k ce descrie semnificaţia
celor k niveluri.

> pain <- c(0,3,2,2,1)


> fpain <- factor(pain,levels=0:3)
> levels(fpain) <- c("none","mild","medium","severe")

Prima comandă crează un vector numeric pain, ce codifică nivelurile de durere


a 5 pacienţi. Dorim să tratăm aceasta ca pe o variabilă categorială; vom crea un
factor fpain din ea utilizând funcţia factor. Ea se apelează cu două argu-
mente: variabila (pain), şi nivelurile (levels=0:3, care indică faptul că intern
se codifică cu valorile 0 − 3). Al doilea argument se poate omite, deoarece R
utilizează implicit valorile din primul argument, sortate corespunzător. Totuşi,
este o bună practică să se dea explicit. Efectul ultimei linii este că numele nive-
lurilor se schimbă ı̂n cele patru şiruri de caractere specificate.

> fpain
[1] none severe medium medium mild
Levels: none mild medium severe
> as.numeric(fpain)
[1] 1 4 3 3 2
> levels(fpain)
[1] "none" "mild" "medium" "severe"
Funcţia as.numeric extrage codurile valorilor sub formă de numere iar levels
extrage numele nivelurilor.
R permite să se creeze un tip special de factori ı̂n care nivelurile să fie ordo-
nate. Aceasta se realizează cu funcţia ordered, care lucrează la fel ca factor.

2.5 Liste
Liste
Listele sunt obiecte ce constau din anumite componente (care pot fi de tip
diferit). Iată un exemplu simplu:
> Lst<-list(name="Fred", wife="Mary", no.children=3,
+ child.ages=c(4,7,9))

8
Componentele sunt ı̂ntotdeauna numerotate şi pot fi referite ca atare. Compo-
nentele individuale ale lui Lst pot fi referite ca Lst[[1]], Lst[[2]], Lst[[3]]
şi Lst[[4]].
Componentele unei liste pot avea nume, caz ı̂n care ele pot fi referite fie
dând numele ca un şir de caractere ı̂n locul numărului componentei ı̂ntre pa-
ranteze pătrate sau, mai convenabil, dând o expresie sub forma nume$nume_componenta,
cu acelaşi efect. Exemple:
> Lst[1]
$name
[1] "Fred"
> Lst[[1]]
[1] "Fred"
> Lst[[4]][1]
[1] 4
> Lst$wife
[1] "Mary"
> Lst["wife"]
$wife
[1] "Mary"
> Lst[["wife"]]
[1] "Mary"
Lungimea unei liste (numărul de componente pe nivelul exterior) se obţine cu
length(name).

2.6 Data frames


Data frames
Un data frame corespunde cu ceea ce ı̂n alte pachete statistice se numeşte
“data matrix” (matrice de date) sau “data set” (set de date, mulţime de date).
Este o listă de vectori şi/sau factori de aceeaşi lungime, legate prin faptul că
datele din aceeaşi poziţie provin din aceeaşi unitate experimentală (subiect,
animal, etc.). În plus, are o mulţime unică de nume de linii.
> intake.pre <- c(5260,5470,5640,6180,6390,
+ 6515,6805,7515,7515,8230,8770)
> intake.post <- c(3910,4220,3885,5160,5645,
+ 4680,5265,5975,6790,6900,7335)
> d <- data.frame(intake.pre,intake.post)
> d
intake.pre intake.post
1 5260 3910
2 5470 4220
3 5640 3885
4 6180 5160
5 6390 5645

9
6 6515 4680
7 6805 5265
8 7515 5975
9 7515 6790
10 8230 6900
11 8770 7335
La fel ca la liste, componentele (i.e., variabilele individuale) pot fi accesate cu
notaţia $:
> d$intake.pre
[1] 5260 5470 5640 6180 6390 6515 6805 7515
[9] 7515 8230 8770

2.7 Indexarea şi selecţia


Indexarea şi selecţia
Indexarea. Indexarea unui element al unui vector
> intake.pre[5]
[1] 6390
Selecţia unui subvector de mai multe elemente, de exemplu elementele 3, 5, 7
> intake.pre[c(3,5,7)]
[1] 5640 6390 6805
> v <- c(3,5,7)
> intake.pre[v]
[1] 5640 6390 6805
> intake.pre[1:5]
[1] 5260 5470 5640 6180 6390
O facilitate distinctivă a lui R este posibilitatea indexării cu indecşi negativi. Se
pot selecta toate observaţiile cu excepţia celor cu numerele 3, 5 şi 7 introducând
> intake.pre[-c(3,5,7)]
[1] 5260 5470 6180 6515 7515 7515 8230 8770
Nu se pot amesteca indici pozitivi şi negativi, deoarece construcţia este am-
biguă.
Selecţie condiţională. În practică, este frecvent nevoie să se extragă date ce
satisfac anumite criterii. Aceasta se poate realiza punând expresii relaţionale
ı̂n locul indecşilor.
> intake.post[intake.pre > 7000]
[1] 5975 6790 6900 7335
> intake.post[intake.pre > 7000 & intake.pre <= 8000]
[1] 5975 6790
Rezultatul unei expresii logice este un vector logic

10
> intake.pre > 7000 & intake.pre <= 8000
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
[9] TRUE FALSE FALSE
Indexarea cu un vector logic ı̂nseamnă că se aleg valorile pentru care vectorul
logic este TRUE, deci ı̂n cazul precedent a 8-a şi a 9-a valoare din intake.post.
Dacă ı̂n vectorul de indexare apar valori lipsă (NA), atunci R va crea elemen-
tul corespunzător ı̂n rezultat, dar cu valorile NA.
În plus faţă de operatorii relaţionali şi logici, există o serie de funcţii care
returnează valori logice. În particular, is.na(x) se utilizează pentru a deter-
mina care elemente din x au valori lipsă (NA). De notat că este o nevoie reală
de funcţia is.na deoarece nu se pot face comparaţii de forma x==NA. O ast-
fel de comparaţie returnează NA pentru orice valoare a lui x. Rezultatul unei
comparaţii cu o valoare necunoscută este necunoscut!

Indexarea şi gruparea ı̂n data frames


Este posibil să se extragă variabile dintr-un data frame tastând, de exemplu,
d$intake.post. Totuşi, este posibil să se utilizeze o notaţie care foloseşte direct
o structură de tip matricial:
> d <- data.frame(intake.pre,intake.post)
> d[5,1]
[1] 6390
> d[5,]
intake.pre intake.post
5 6390 5645
d[2] este echivalent cu d[,2].
Se pot aplica şi alte tehnici de indexare, de exemplu selecţia
> d[d$intake.pre>7000,]
intake.pre intake.post
8 7515 5975
9 7515 6790
10 8230 6900
11 8770 7335
> #explain why
> sel <- d$intake.pre>7000
> sel
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
[9] TRUE TRUE TRUE
> d[sel,]
intake.pre intake.post
8 7515 5975
9 7515 6790
10 8230 6900
11 8770 7335

11
Dacă colecţia de date este mare, este uneori convenabil să examinăm numai
primele câteva cazuri. Aceasta se poate face prin indexare. Deoarece o astfel de
situaţie apare frecvent, s-a implementat funcţia head. Implicit, ea vizualizează
primele şase linii. La fel, tail arată ultima parte.
> #indexing
> d[1:2,]
intake.pre intake.post
1 5260 3910
2 5470 4220
> #head
> head(d)
intake.pre intake.post
1 5260 3910
2 5470 4220
3 5640 3885
4 6180 5160
5 6390 5645
6 6515 4680
> #tail
> tail(d)
intake.pre intake.post
6 6515 4680
7 6805 5265
8 7515 5975
9 7515 6790
10 8230 6900
11 8770 7335

Un mod natural de memorare a datelor grupate ı̂ntr-un data frame este de


a păstra datele ı̂ntr-un vector şi ı̂n paralel să avem un factor care ne spune
apartenenţa datelor la grupuri. Să considerăm, ca exemplu, următorul set de
date care ne dă consumul energetic pentru femei slabe şi obeze.
> energy
expend stature
1 9.21 obese
2 7.53 lean
3 7.48 lean
4 8.08 lean
5 8.09 lean
6 10.15 lean
7 8.40 lean
8 10.88 lean
9 6.13 lean
10 7.90 lean
11 11.51 obese

12
12 12.79 obese
13 7.05 lean
14 11.85 obese
15 9.97 obese
16 7.48 lean
17 8.79 obese
18 9.69 obese
19 9.68 obese
20 7.58 lean
21 9.19 obese
22 8.11 lean
Acest format este convenabil deoarece se poate generaliza uşor la date clasifi-
cate după criterii multiple. Totuşi, uneori este de dorit să avem datele ı̂ntr-un
vector separat pentru fiecare grup. Din fericire, este uşor să le extragem dintr-
un data frame:
> exp.lean <- energy$expend[energy$stature=="lean"]
> exp.obese <- energy$expend[energy$stature=="obese"]
Ca alternativă, se poate utiliza funcţia split, care generează o listă de vectori
conform unei grupări.
> l <- split(energy$expend, energy$stature)
> l
$lean
[1] 7.53 7.48 8.08 8.09 10.15 8.40 10.88 6.13 7.90
[10] 7.05 7.48 7.58 8.11

$obese
[1] 9.21 11.51 12.79 11.85 9.97 8.79 9.69 9.68 9.19

2.8 Cicluri implicite


Cicluri implicite
O utilizare comună a ciclurilor este să se aplice o funcţie fiecărui element al
unei mulţimi de valori sau vectori şi să se pună rezultatul ı̂ntr-o singură struc-
tură. In R aceasta se realizează cu funcţiile lapply şi sapply. Prima returnează
ı̂ntotdeauna o listă (de unde şi ‘l’), ı̂n timp ce ultima ı̂ncearcă să simplifice (de
unde apare ’s’) rezultatul, dacă este posibil, la un vector sau o matrice.
> head(thuesen)
blood.glucose short.velocity
1 15.3 1.76
2 10.8 1.34
3 8.1 1.27
4 19.5 1.47
5 7.2 1.27

13
6 5.3 1.49
> lapply(thuesen, mean, na.rm=T)
$blood.glucose
[1] 10.3

$short.velocity
[1] 1.325652

> sapply(thuesen, mean, na.rm=T)


blood.glucose short.velocity
10.300000 1.325652
Uneori dorim să repetăm ceva de un număr de ori şi să punem rezultatul ı̂ntr-
un vector. Evident, aceasta are sens numai dacă calculul repetat dă rezultate
diferite, ca de exemplu ı̂ntr-o simulare. Aceasta se poate realiza cu sapply,
dar există şi o versiune simplificată, numită replicate, ı̂n care trebuie să daţi
numai un număr de repetări şi expresia de evaluat:
> replicate(10,mean(rexp(20)))
[1] 1.0280245 1.3731307 0.8057787 1.2005030 0.8069861
[6] 0.8026956 0.8648251 0.8730785 0.7314418 1.2089620
O funcţie similară, apply, ne permite să aplicăm o funcţie liniilor sau coloane-
lor unei matrice (sau ı̂n general după indicii unui tablou multidimensional) ca
ı̂n
> m <- matrix(rnorm(12),4)
> m
[,1] [,2] [,3]
[1,] 0.27791413 -0.008309014 1.7635520
[2,] -0.82308112 0.128855402 0.7625865
[3,] -0.06884093 -0.145875628 1.1114311
[4,] -1.16766233 -0.163910957 -0.9232070
> apply(m, 2, min)
[1] -1.167662 -0.163911 -0.923207
De asemenea, funcţia tapply ne permite să creăm tabele (deci ‘t’) de valori ale
unei funcţii pe subgrupuri definite de al doilea argument al său, care poate fi un
factor sau o listă de factori. În ultimul caz, se generează o tabelă de clasificare
după mai mulţi factori (tabelă de contingenţă). Se pot defini şi grupări după
vectori obişnuiţi. Ele vor fi convertite intern ı̂n factori.
> tapply(energy$expend, energy$stature, median)
lean obese
7.90 9.69

2.9 Sortare
Sortare

14
Comanda sort este trivială
> intake.post
[1] 3910 4220 3885 5160 5645 4680 5265 5975 6790 6900
[11] 7335
> sort(intake.post)
[1] 3885 3910 4220 4680 5160 5265 5645 5975 6790 6900
[11] 7335
Nu ı̂ntotdeauna sortăm după un vector. Frecvent, avem nevoie să sortăm o se-
rie de variabile conform valorilor unei alte variabile — de exemplu, tensiunea
arterială după sex şi vârstă. În acest scop, trebuie să obţinem ı̂ntâi o ordine a
acestor variabile.
> order(intake$post)
[1] 3 1 2 6 4 7 5 8 9 10 11
Ideea este că, indexând cu acest vector, se pot sorta şi alte variabile după acelaşi
criteriu.
> order(intake$post)->o
> intake$post[o]
[1] 3885 3910 4220 4680 5160 5265 5645 5975 6790 6900
[11] 7335
> intake$pre[o]
[1] 5640 5260 5470 6515 6180 6805 6390 7515 7515 8230
[11] 8770
Putem să sortăm şi un data frame, de exemplu intake
> intake.sorted <- intake[o,]
> intake.sorted
pre post
3 5640 3885
1 5260 3910
2 5470 4220
6 6515 4680
4 6180 5160
7 6805 5265
5 6390 5645
8 7515 5975
9 7515 6790
10 8230 6900
11 8770 7335
Sortarea după mai multe criterii se realizează punând mai multe argumente
ı̂n order; de exemplu, order(sex,age) ne va da ı̂ntâi o ordonare ı̂n bărbaţi şi
femei şi apoi pentru fiecare sex după vârstă. Se utilizează o a doua variabilă
dacă ordinea nu poate fi decisă de prima variabilă. Sortare ı̂n ordine inversă se
poate realiza schimbând semnul variabilei.

15
3 Operatori, matrice şi Algebră liniară
3.1 Operatori
Operatori
Operatori
Aritmetici de comparare Logici
+ adunare < !x not
- scădere > x&y and
* ı̂nmulţire <= x&&y and f.
/ ı̂mpărţire >= x|y or
ˆ putere == x||y or f.
%% modulo != xor(x,y) sau exclusiv
%/% ı̂mpărţire ı̂ntreagă
Caracterele următoare sunt, de asemenea, operatori ı̂n R: $, @, [, [[, :, ?, <-,
<<-, =, ::. Tabela operatorilor şi precedenţa lor se poate obţine cu ?Syntax.

3.2 Facilităţi matriciale


Produs exterior
Dacă a şi b sunt două tablouri numerice, produsul exterior al lor este un ta-
blou a cărui dimensiune se obţine concatenând cele două dimensiuni ale vecto-
rilor (ordinea este importantă) şi al cărui vector de date se obţine făcând toate
produsele posibile de elemente ale vectorului a cu vectorul b. Produsul exterior
se calculează cu operatorul special %o%:
> a<-1:3
> b<-4:6
> ab<-a%o%b
> ab
[,1] [,2] [,3]
[1,] 4 5 6
[2,] 8 10 12
[3,] 12 15 18
O alternativă este ab<-outer(a,b,"*"). Funcţia de ı̂nmulţire se poate ı̂nlocui
cu o funcţie arbitrară de două variabile. De exemplu, dacă dorim să evaluăm
funcţia f ( x, y) = cos(y)/(1 + x2 ) peste o grilă dreptunghiulară de valori cu
coordonatele x şi y definite de vectorii R x şi respectiv y, putem proceda astfel

> f <- function(x, y) cos(y)/(1 + x^2)


> z <- outer(x, y, f)

3.3 Facilităţi matriciale


Facilităţi matriciale
t(X) - transpusa lui X

16
nrow(A)
ncol(A)
%*% - ı̂nmulţire de matrice
Dacă x este un vector, atunci x %*% A %*% x este o formă pătratică.
Funcţia crossprod(): crossprod(X,y) este echivalentă cu t(X) %*% y dar
operaţia este mai eficientă. Dacă al doilea argument al lui crossprod() lipseşte
se ia identic cu primul.
Semnificaţia lui diag() depinde de argumentul său. diag(v), unde v este
un vector, construieşte o matrice diagonală formată cu elementele vectorului.
diag(M), unde M este o matrice, dă un vector format din elementele diagonalei
principale a lui M. Se utilizează aceeaşi convenţie ca ı̂n MATLAB. Totuşi, dacă
k este un număr, atunci diag(k) este matricea unitate k pe k!
Pentru a rezolva sistemul Ax = b folosim solve(A,b). Funcţia este ma-
tematic echivalentă cu x = A−1 b. Inversa A−1 a lui A se poate calcula cu
solve(A). Funcţia eig calculează valorile şi vectorii proprii ai unei matrice,
det determinantul, iar svd descompunerea cu valori singulare. Exemple:
> A<-matrix(1:4,2,2)
> A
[,1] [,2]
[1,] 1 3
[2,] 2 4
> b<-c(4,6)
> x<-solve(A,b); x
[1] 1 1
> X<-solve(A)
> A%*%X
[,1] [,2]
[1,] 1 0
[2,] 0 1
> X%*%A
[,1] [,2]
[1,] 1 0
[2,] 0 1
> ev<-eigen(A)
> ev
$values
[1] 5.3722813 -0.3722813

$vectors
[,1] [,2]
[1,] -0.5657675 -0.9093767
[2,] -0.8245648 0.4159736

> det(A)
[1] -2

17
> sd<-svd(A); sd
$d
[1] 5.4649857 0.3659662

$u
[,1] [,2]
[1,] -0.5760484 -0.8174156
[2,] -0.8174156 0.5760484

$v
[,1] [,2]
[1,] -0.4045536 0.9145143
[2,] -0.9145143 -0.4045536
> sd$u%*%diag(sd$d)%*%t(sd$v)
[,1] [,2]
[1,] 1 3
[2,] 2 4

Bibliografie

Bibliografie
[1] W. N. Venables, D. M. Smith and the R Development Core Team, An Intro-
duction to R, 2015
[2] Peter Dalgaard, Introductory Statistics with R, 2nd ed., Springer Verlag, 2008.

[3] Norman Matloff, THE ART OF R PROGRAMMING. A Tour of Statistical


Software Design, No Starch Press, San Francisco, 2011

18

S-ar putea să vă placă și