RStudio
RStudio
LIMBAJUL R
1.1. De ce R?
R este un mediu integrat de faciliti software care permite analiza statistic i reprezen-tarea grafic a datelor. Acesta include un limbaj simplu de programare, limbajul S, care permite utilizarea pachetelor existente i construirea de pachete noi de programe destinate analizei statistice i reprezentrii grafice a datelor. Exist un numr mare de programe cu ajutorul crora se efectueaz analize statistice i reprezentri grafice. ntrebarea fireasc ce se pune este: de ce s utilizm R i nu alte sisteme? Exist un numr mare de argumente n favoarea utlizrii sistemului R. Amintim aici doar dou dintre cele mai importante: R poate fi obinut gratuit de pe site-ul oficial al proiectului R ([Link] i este uor de instalat pe aproape orice computer disponibil; R permite utilizatorului efectuarea unui numr extrem de mare de analize statistice, nce-pnd cu cele mai simple i terminnd cu cele mai complexe. Aceasta inseamn c utilizatorul va gsi intotdeauna metodele cele mai adecvate pentru analiza propriilor date. Pe lng aceste avantaje, R dispune de capciti excelente de programare i de reprezentare grafic, astfel nct acesta poate fi utilizat nu numai n scopuri de cercetare, dar i n scopuri didactice. Un alt avantaj major al utilizarii sistemului R este existena unui numr impresionant de pachete de programe de analiz a datelor ce pot fi descrcate imediat i gratuit de pe internet. Textul principal al acestei cri prezint modul n care se instaleaz i se lanseaz n execuie sistemul R, noiunile teoretice i funciile corespunztoare pentru analiza statistic i reprezentarea grafic a datelor n R precum i modul n care rezultatele acestor analize pot fi salvate n fiiere de diferite tipuri. Problemele simple prezentate odat cu introducerea unei noiuni noi ajut la nelegerea principiilor care stau la baza sistemului R i ofer o baz solid pentru utilizarea pe viitor a unor pachete de analiz statistic mai complexe scrise n acest limbaj.
PROBLEME
poate crea propriile pachete de programe n R. - R Data Import/Export - R Installation and Administration - R Internals - The R Reference Index standard #descrie facilitile de import i export ale sistemului R. #instruciuni de instalare i administrare #ghid al structurilor R interne i standardele echipei care lucreaz la proiectul R. #conine fiierele help ale programelor
din R i ale pachetelor de programe recomandate. Trebuie menionat faptul c aceste manuale sunt disponibile la data precizat mai sus. Aceste manuale pot fi actualizate sau terse. Este posibil apariia unor manuale noi la aceast adres.
2. Ce este CRAN?
Soluie CRAN este abrevierea de la Comprehensive R Archive Network ([Link] Aceast arhiv conine diferitele variante ale sistemului R, ale pachetelor i ale seturilor de date asociate.
1.2.
Instalarea sistemului R
Dac nu avei R instalat trebuie s l descrcai (download) de la adresa [Link] i s l instalai pe calculatorul dumneavoastr. La aceast adres, care este site-ul oficial al proiectului, se afl stocate diferite versiuni ale sistemului R. Deoarece acest sistem se dezvolt continuu, este indicat s descrcai ultima variant disponibil. Instruciunile de instalare sunt furnizate tot pe acest site. R poate fi instalat sub Windows, Unix, Linux i versiunea 10 a sistemului de operare Macintosh. Odat cu R se descarc i o serie de pachete de programe i seturi de date care, n ultimele variante, sunt parte integrant a sistemului R. Pe lng acestea, exist i pachete de programe sau seturi de date care se descarc opional. Acestea sunt disponibile pe site-ul CRAN de la adresa menionat mai sus sau de la oglinzi ale acestuia. Cei mai muli utilizatori de Windows instaleaz R acionnd ,,click pe iconia ce apare pe desktop odat ce versiunea executabil (binar) a fost descrcat de pe pagin oficial a acestui proiect. Un program de instalare va ghida utilizatorul n acest proces. Instalarea, folosind opiunea default, va genera o iconi pe desktopul calculatorului dumneavoastr. Sistemul R poate fi lansat acionnd ,,click de dou ori pe aceast iconi. Rezultatul va fi apariia pe ecran a unui text de tipul: R version 2.11.1 (2010-05-31) Copyright (C) 2010 The R Foundation for Statisticl Computing ISBN 3-900051-07-0 R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. Natural language support but running n an English locale R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages n publications. Type 'demo()' for some demos, 'help()' for on-line help, or '[Link]()' for an HTML browser interface to help. Type 'q()' to quit R n acest moment, ai deschis o sesiune R. Aa cum am menionat, limbajul R are la baz un set de comenzi (command-driven). n regim interactiv aceste comenzi sunt scrise dup prompterul >. Comenzile pot fi de asemenea scrise n fiiere i executate folosind funcia source() sau scrise dup prompterul > cu ajutorul schemei copy-andpaste. Prsirea sesiunii R se face utiliznd comanda >q( ) Pe ecran va aparea o ntrebare referitoare la salvarea sau nu a sesiunii de lucru. Sesiunea de lucru se poate salva ntr-un fiier, pentru a fi redeschis mai trziu, sau se poate renuna definitiv la aceasta. Atunci cnd utilizm R sub Windows este indicat s crem un director de lucru iar calea acestui director s fie setat n cmpul Start In din scurttura (shortcut) lui R. Fiierele din acest director vor putea fi accesate din R fr a mai preciza ntreaga cale. n mod similar, fiierele create ntr-o sesiune R vor fi stocate n acest director de lucru. Coninutul directorului de lucru (numele fiierelor) se obin cu comanda dir(). Directorul de lucru poate fi schimbat interactiv cu comanda setwd(). Calea directorului de lucru este returnat de funcia getwd(). Dac utilizm R sub Unix sau Linux se procedeaz similar. n primul rnd se creeaz un director de lucru pe care l denumim, spre exemplu, work. n acest director vor fi stocate fiierele ce vor fi utilizate n sesiunea interactiv a lui R. Directorul se creeaz cu comanda $mkdir work Se intr n acel director cu comanda $cd work. Odat ajuni n directorul work se tasteaz comanda $R n acest mod se lanseaz o sesiune R. Pe ecran se va deschide o fereastr cu prompterul > ceea ce indic faptul c sesiunea R interactiva este deschis.
PROBLEME
dumneavoastr. Creai directorul C:/LUCRU i facei ca acest director s fie director de lucru al sistemului R pe care tocmai l-ai instalat.
Soluie Primul pas este accesarea site-ului oficial al proiectului R ([Link] i de aici acionnd click pe CRAN (stnga mijloc) se obine o pagin cu linkurile de unde se poate descrca (download) sistemul R. Alegei de exemplu adresa de la Berkeley ([Link] i dai click pe Download R 2.11.1 for Windows. Alegnd opiunea SAVE, varianta binar (executabil) a lui R va fi ncarcat pe calculatorul dumneavoastr. Dup terminarea salvrii pe Desktopul calculatorului dumneavoastr va aprea o iconi cu numele [Link]. Dai clikde dou ori pe aceasta i urmai instruciunile de instalare. Este de dorit s alegei de fiecare dat opiunea default. La sfritul acestui proces, pe ecran se va creea iconia R 2.11.1. Acionnd click de dou ori pe aceast iconi se deschide o sesiune R interactiv. Pentru punctul doi al problemei se creaz mai nti directorul LUCRU pe discul C (C:/LUCRU). Se acioneaz apoi click cu butonul din dreapta al mause-ului pe iconia R 2.11.1, i apoi pe Properties. n csua Start care apare se scrie C:/LUCRU i se nchide fereastra. n acest fel C:/LUCRU devine directorul de lucru pentru sesiunea R lansat cu ajutorul acestei iconie.
1.3.
Comanda help()
R dispune de funcii care permit obinerea rapid de informaii referitoare la funciile i facilitile sistemului R instalat pe calculatorul dumneavoastr. Pentru a obine informaii despre o anumit funcie, de exemplu [Link](), se execut comanda >help([Link]). O comand alternativ este >?[Link]. Pentru funciile specificate prin caractere speciale, ca de exemplu for, if sau function, argumentele trebuie incluse ntre ghilimele (). n caz contrar, argumentele nu sunt interpretate ca iruri de caractere. Pentru a obine informaii despre facilitile oferite de funcia help(), din R se execut comanda [Link](). Aceast comand va lansa un Web browser cu o serie de pagini coninnd diferite linkuri care permit accesarea informaiilor legate de sistemul R i instalarea acestuia. Exemple pentru o anumit topic pot fi obinute prin executarea comenzii >example(topic). Versiunea Windows a lui R permite accesarea ,,help-ului cu comanda >?help Funcia [Link]() se apeleaz cu comanda >[Link](pattern, .....)
unde pattern este un ir de caractere, iar alte argumente. Aceast funcie permite compararea irului de caractere precizat cu irurile de caractere care formeaz nume de fiiere, titluri etc, din help-ul sitemului R. Numele i titlurile compatibile sunt afiate pe ecran. Aceast comand poate ajuta utilizatorul s identifice obiectele R cutate. Dac calculatorul este conectat la internet se poate utiliza funcia RsiteSearch() pentru cutarea online a unor cuvinte cheie sau a unor fraze dorite de utilizator n manualelele R disponibile online, n paginile help sau n arhivele de liste de emailuri ale sistemului R. Aceast funcie are ca argument parametrul restrict care permite limitarea cutarii doar la o colecie de informaii de un anumit tip. Pentru detalii se poate utiliza funcia help(RsiteSearch).
PROBLEME
1. Care este comanda prin care obtinei informaii despre funcia help() din R?
Soluie Informaiile solicitate se obin cu comanda >help(help) sau >?help
2. Care este comanda pentru obinerea de informaii despre funcia [Link](). Dar
despre funciile if(), for() i function()? Souluie Se folosesc comenzile >help([Link]) >help(if) >help(for) >help(function) De notat prezena ghilimelelor n interiorul parantezelor la ultimele trei comenzi. 3. Utilizai funcia [Link]() pentru a identifica funciile cu ajutorul crora se poate efectua analiza cluster. Soluie Comanda este >[Link]("cluster") Pe ecran vor fi afiate o serie de informaii care permit identificarea funciilor sau pachetelor de programe cu ajutorul crora se efectueaz analiz cluster n R. De exemplu, ntr-una din liniile afiate pe ecran este scris: stats::kmeans K-Means Clustering. Aceasta indic faptul ca funcia kmeans, disponibil n pachetul stats permite efectuarea analizei cluster folosind metoda K-Means Clustering. Informaii detaliate referitoare la aceast funcie se obin cu comanda >help(kmeans)
1.4.
Odat cu lansarea sistemului R, se ncarc automat o serie de arhive (repositories or databases) n care acesta caut obiectele necesare evalurii unei anumite comenzi. Spaiul de lucru (Globalenv) este primul din aceast list de cutare. Astfel comanda ls(pos=1) este echivalent cu ls(). Comanda ls(pos=2) listeaz obiectele din a doua list de cutare i aa mai departe. Cile de cutare pot fi extinse cu ajutorul funciilor attach() or library(). Funcia attach() permite accesul la tablouri de date sau liste de obiecte R n timp ce funcia library() permite accesul la bibliotecile de funcii i seturile de date asociate din diferite pachete de programe. Detalii referitoare la aceste funcii se pot obine cu help(attach) i help(library). Comenzile n R sunt separate fie de simbolul punct i virgul (semi-colon) (;) fie sunt scrise pe linii diferite. Comenzile elementare pot fi grupate ntr-o expresie comun cu ajutorul acoladelor ({comenzi}). Orice ir de caractere precedat de simbolul # este interpretat ca fiind un comentariu. Comentariile pot fi plasate oriunde n interiorul programului. Dac o comand nu este complet la sfritul unei linii, R va lansa un prompter nou, de obicei simbolul +, n linia sau n liniile urmtoare. Acest simbol dispare cnd comanda este complet. n R se face distincie ntre literele mari i cele mici (sunt entiti distincte) ca dealtfel i n UNIX. De exemplu caracterele M, i m sunt interpretate distinct. Aa cum am menionat anterior, comenzile pot fi lansate n regim interactiv prin scrierea lor dup prompterul > i apoi apsarea tastei ENTER. Este uneori mai comod s scriem aceste comenzi ntr-un fiier text i s le executm folosind funcia source(). Presupunem c fiierul care conine comenzile ce urmeaz a fi executate se numete test_com.txt i se afl n directorul de lucru, n cazul nostru n C:/LUCRU. Comanda >source(test_com.txt) va avea ca efect ncrcarea n spaiul de lucru i executarea comenzilor coninute n fiierul test_com.txt. R dispune de un mecanism de rechemare a comenzilor executate. Prin apsarea tastei de deplasare pe vertical n sus, situat n partea dreapta de jos a tastaturii, se pot obine comenzile scrise anterior. Acestea pot fi reexecutate sau modificate i apoi executate. Entitile pe care R le poate creea sau manipula poart denumirea de obiecte R sau, pe scurt, obiecte. Acestea pot fi variabile, tablouri de numere, iruri de caractere, funcii sau structuri create cu aceste funcii. ntr-o sesiune R obiectele sunt create i identificate cu ajutorul numelor. Comanda >objects() sau comanda alternativ >ls() poate fi utilizat pentru a lista pe ecran numele obiectelor care sunt disponibile n sesiunea de lucru. Mulimea obiectelor disponibile la un moment dat ntr-o sesiune R formeaz spaiul de lucru (workspace). Aceste obiecte pot fi terse cu ajutorul funciei rm(). Dac, de exemplu, dorim s tergem vectorii x i y din spaiul de lucru, atunci folosim comanda >rm(x,y)
Pentru tergerea tuturor obiectelor din spaiul de lucru al unei sesiuni R se folosete comanda >rm(list=ls()) Toate obiectele create n timpul unei sesiuni R pot fi salvate ntr-un fiier i pot fi utilizate n sesiunile viitoare. Obiectele aflate la un moment dat n spaiul de lucru pot fi salvate cu ajutorul funciei save(). Aceste obiecte pot fi apoi ncrcate pentru a fi utilizate ntr-o alt sesiune cu ajutorul funciei load(). Alte cteva funcii utile n manipularea obiectelor din spaiul sau directorul de lucru sunt enumerate mai jos. [Link]() #aleg un fiier interactiv sessionInfo #afiez pe ecran informaii despre R si pachetele ataate [Link] #calea directorului in care R este instalat .Library #calea bibliotecilor R corespunztoare opiunii default [Link]() #setrile variabilelor din spaiul de lucru La sfritul fiecrei sesiuni se pot salva toate obiectele din spaiul de lucru. Aceste obiecte se salveaz, de obicei, ntr-un fiier numit .Rdata din directorul de lucru iar irul comenzilor utilizate n sesiune n fiierul .Rhistory din acelai director. Pentru salvarea ntregului spaiu de lucru se poate utiliza funcia [Link](). Cnd R este lansat avnd acelai director de lucru asociat, obiectele i comenzile din aceste fiiere se ncarc automat. Este recomandat s se utilizeze directoare de lucru separate pentru fiecare nou sesiune R. n acest fel se evit suprapunerea obiectelor sau funciilor cu acelai nume. Amestecarea necontrolat a obiectelor din diferite sesiuni poate crea probleme majore i trebuie evitat.
PROBLEME
folosete funcia print(). Utilizai funcia help() pentru a obine informaii despre utilizarea funciei print(). Scriei aceast comand n fiierul test_com.txt din directorul de lucru i folosii funcia source() pentru executarea acestei comenzi. Soluie Rezolvm problema mai nti n modul interactiv. Se vor executa urmtoarele comenzi: >help(print) #informaii despre forma funciei print >print(numele meu este Popescu) #printare folosind opiunile default [1] "numele meu este Popescu" #rezultat Dac comenzile sunt scrise n fiierul test_com.txt din fiierul de lucru, atunci se execut comanda: >source([Link]) #apelarea comenzilor din fiierul [Link] [1] "numele meu este Popescu" #rezultat
>5.3-8.21 [1] -2.91 >8.25*2.25 [1] 18.5625 >7.25/8.42 [1] 0.8610451 >sqrt(2.13) [1] 1.459452
n mod similar se pot efectua toate operaiile aritmetice permise de un calculator de buzunar.
scrise cu ase zecimale. Utilizai funcia options() pentru a scrie pe ecran rezultatul mpririi numrului 7.25 la 8.42 ca un numr cu dou zecimale. #trunchez la dou zecimale #mprire #rezultat
2.
2.1.
n acest capitol vom prezenta elementele de baz ale limbajului R prin intermediul unor exemple simple. Abordri mai complexe pot fi gsite n manualele specializate destinate nvrii limbajului R.
anumit expresie aritmetic trebuie s aib aceeai lungime. Dac lungimile sunt diferite operaiunea se efectueaz dar rezultatul, care este nsoit de un mesaj de eroare, este greu de interpretat. Operaiile aritmetice cu vectori acceptate de limbajul R sunt adunarea (+), scderea (-), imprirea (/), i ridicarea la putere (^). n plus, vectorilor numerici li se pot aplica funciile cunoscute cum ar fi logaritmul (log), exponentiala (exp), funciile trigonometrice sinus (sin), cosinus (cos), tangenta (tan), radicalul (sqrt) etc. Exist funcii definite care se pot utiliza pentru a determina unele caracteristici ale vectorilor numerici. Dac x este un vector atunci funcia length(x) returneaz dimensiunea (lungimea) lui x. Funciile min(x) i max(x) returneaz cel mai mic i respectiv cel mai mare element al lui x. Funciile prod(x) i sum(x) returneaz produsul i respectiv suma tuturor elementelor lui x. Funciile mean(x) i var(x) returneaz media i respectiv variana lui x. Funcia sort(x) returneaz un vector de aceeai dimensiune ca x dar cu elemente aranjate n ordine cresctoare.
PROBLEME
3. Fie vectorul x=(1,2,7,4). Determinai valoarea minim, maxim, lungimea, produsul, suma, media i variana. Soluie
>max(x) [1] 7 >min(x) [1] 1 >length(x) [1] 4 >sum(x) [1] 14 >mean(x) [1] 3.5 >var(x) [1] 7
#determin valoarea maxim i o afiez pe ecran #rezultat #determin valoarea minima i o afiez pe ecran #rezultat #determin lungimea vectorului i o afiez pe ecran #rezultat #determin suma elementelor lui x i o afiez pe ecran #rezultat #determin media i o afiez pe ecran #rezultat #determin variana i o afiez pe ecran #rezultat
O funcie nrudit cu seq() este rep(). Aceast funcie se utilizeaz pentru a replica un obiect n diferite moduri. De exemplu, vectorul y obinut prin repetarea de dou ori a vectorului x=(1,2,3) se obine cu secvena de comenzi de mai jos. >x=c(1,2,3) #creez vectorul x >y=rep(x,times=2) #creez vectorul y prin repetarea lui x de dou ori >y #vizualizez y pe ecran [1] 1 2 3 1 2 3 #rezultat O alt posibilitate este de a repeta fiecare element al lui x de un anumit numr de ori. De exemplu, vectorul care conine elementele lui x fiecare repetate de dou ori se obine cu comanda >y<-rep(x, each=2) #creez vectorul y >y #afiez pe ecran elementele lui y [1] 1 1 2 2 3 3 Este important s putem identifica anumite secvene n irurile de date. Operatorul %in% care testeaz existena unei secvene ntr-un ir de numere este deosebit de util n acest scop. De exemplu >x<-rep(1:5,rep(3,5)) #creez secvena regulat de numere >x #afiez pe ecran [1] [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 #rezultat >x[x%in%c(2,4)] #testez existena cifrelor 2 si 4 n x [1] 2 2 2 4 4 4 #rezultat Pentru a vedea care elemente ale lui x sunt 2 sau 4 i care nu se utilizeaz funciile match() i nomatch(). De exemplu comanda >match(x,c(2,4),nomatch=0) [1] 0 0 0 1 1 1 0 0 0 2 2 2 0 0 0 #rezultat are ca efect atribuirea cifrei 1 poziiilor ocupate de 2, a cifrei 2 a celor ocupate de 4 si 0 n rest.
PROBLEME
2. S se genereze secvena de numere de la -30 la 30 cu pasul 10 i de la -15 la 15 cu pasul 5. Secvenele rezultate s fie concatenate ntr-un singur vector. Care este lungimea acestuia?
Soluie
>x1<-seq(-30,30,by=10) >x2<-seq(-15,15,by=5) >y <-c(x1,x2) >y [1] -30 -20 -10 0 10 20 30 -15 -10 -5 0 5 10 15 >length(y) pe ecran [1] 14
#generez vectorul x1 #generez vectorul x2 #concatenez x1 i x2 #afiez y pe ecran #rezultat #calculez lungimea lui y i o afiez
#rezultat
PROBLEME
2. Creai vectorul logic asociat condiiei x diferit de -2, unde x este vectorul numeric
din problema precedent. Soluie >y<-x!=(-2) >y [1] TRUE TRUE TRUE FALSE TRUE #creez vectorul logic y #afiez pe ecran vectorul y #rezultat
PROBLEME
y2=x2/x1. Utilizai funciile [Link]() i [Link]() pentru a determina cte valori nedefinite NA i NaN conin vectorii y1 i y2. Soluie >x1<-c(1,0,1) >x2<-c(0,0,1) >y1<-x1/x2 #creez vectorul x1 #creez vectorul x2 #creez vectorul y1
>y2<-x2/x1 >y1 [1] Inf NaN 1 >[Link](y1) [1] FALSE TRUE FALSE >y2 [1] 0 NaN 1 >[Link](y2) [1] FALSE TRUE FALSE
#creez vectorul y2 #afiez y1 #rezultat #afiez vectorul logic al valorilor nedefinite #rezultat #afiez y2 #rezultat #afiez vectorul logic al valorilor nedefinite #rezultat
2. Se d vectorul x=(1,6,2,NA). Creai vectorul logic ale crui elemente sunt TRUE pe poziia ocupat de NA i FALSE n rest. nlocui NA cu -999. Creai vectorul z de aceiai lungime cu x ale crui elemente sunt NA.
Soluie >x<-c(1,6,2,NA) >y <-[Link](x) >y [1] FALSE FALSE FALSE TRUE >x[[Link](x)]<--999 >x [1] 1 6 2 -999 >z<-x==NA >z [1] NA NA NA NA #creez vectorul x #vectorul logic #rezultat #nlocuiesc NA cu -999 #rezultat #toate elementele lui z sunt NA #rezultat
3. Atribuii elementelor mai mari dect 4 ale vectorului x=(1,NA,6,2,10) valorile 101 si
respectiv 102. Ce se ntmpl dac pe poziia lui NA din vectorul x incercm s atribuim una dintre aceste valori? Soluie > x[& x>4] <-c(101,102) #atribui 101 i 102 >x [1] 1 NA 101 2 102 #rezultat Dac se execut comanda >x[x>4]=c(101,102) se obine mesajul de eroare: Error in x[x > 4] = c(101, 102): NAs are not allowed in subscripted assignment
sau simbolul . n general secvena de caractere se termina cu simbolurile \sau \\. Pot fi utilizate ns i simbolurile \n (linie nou), \t (tab) sau \b (backspace). Vectorii de tip caracter pot fi concatenai utiliznd funcia c(). Funcia paste() poate lua un numr arbitrar de argumente pe care le concateneaz unul cte unul. Orice numr este transformat n caracter. Argumentele sunt separate de un singur caracter blanc. Caracterul blanc poate fi schimbat cu un ir de caractere prin intermediul argumentului sep. De exemplu, comanda >labs<-paste(c("X","Y"), 1:10,sep="") genereaz vectorul caracter labs= "X1" "Y2" "X3" "Y4" "X5" "Y6" "X7" "Y8" "X9" "Y10" Funcia strsplit() permite extragerea unor caractere dintr-un vector caracter utilizat ca argument. De exemplu, daca dorim s mprim vectorul abracadabra n subiruri delimitate de caracterul r, se folosim comanda >strsplit(abracadabra, r) avnd ca rezultat vectorii caracter ab, acadab i a. Funcia ncar() permite determinarea numerelor de caractere din care este alctuit un vector caracter. Funcia sort() aranjaz elementele unui vector caracter n ordine alfabetic. De interes este i funcia [Link]() care ne permite s vedem dac un anumit vector este de tip caracter.
PROBLEME
1. Numele unei persoane este Popescu iar prenumele Ion. Scriei ntregul nume ntrun singur ir de caractere folosind funcia paste (). Soluie. >nume<-Popescu >prenume<-Ion >numeintreg<-paste(nume,prenume) >numeintreg [1] Popescu Ion #creez vectorul caracter nume #creez vectorul caracter prenume #creez numele intreg #afiez numele intreg #rezultat
negative i de tip caracter. Vectorii index trebuie s aib aceeai lungime ca vectorii corespunztori ale cror elemente trebuie selectate. Vectorii index logici au ca elemente irurile de caractere TRUE i FALSE. Valorile corespunztoare lui TRUE sunt selectate iar cele lui FALSE sunt omise. De exemplu, pentru a selecta valorile definite ale vectorului x i a le salva n vectorul y se folosete comanda >y<-x[] De asemenea, comanda >(x+1)[()&x>0]->z genereaz un vector z care conine elementele vectorului x+1 pentru care elementele corespunztoare ale lui x sunt definite (NA or NaN sunt excluse) i pozitive. Vectorii index care au ca elemente numere ntregi i pozitive sunt des utilizai n R. Valorile vectorului index trebuie s fie n domeniul {1,2,,length(x)}. Elementele cores-punztoare vectorului sunt selectate i concatenate n aceast ordine n vectorul rezultant. De exemplu, x[6] este al aselea element al lui x iar x[1:10] primele 10 elemente ale lui x. De asemenea, comanda >c(x,y)[rep(c(1,2,2,1),times=4)] genereaz un vector de tip caracter de lungime 16 format din x,y,y,x repetat de patru ori. Vectorii index pot conine i numere ntregi negative. n acest caz sunt excluse elementele aflate pe aceeai poziie cu numerele ntregi i negative din vectorul index. Astfel, comanda >y<-x[-(1:5)] genereaz vectorul y care conine elementele lui x n afara de primele 5. Vectorii index de caractere se aplic doar la obiecte care au nume atribuite pentru a identifica componentele lor. n acest caz un sub-vector al vectorului de nume poate fi utilizat n acelai mod ca numerele ntregi pozitive din exemplul discutat anterior. Exemplul de mai jos arat modul n care se utilizeaz acest tip de vectori de tip index.: >fructe<-c(5,10,1,20) #generez interactiv vectorul fructe >nume(fructe)<-c(portocale,banane,mere,piersici) #numele fructelor >prinz<-fructe[c(mere,portocale)] #asociez numele Exemplul de mai sus evideniaz avantajul utilizrii numelor sub form alfanumeric n locul formei numerice. Este mai dificil s inem minte ca la prnz vom mnca fructele 1 i 5 dect ca vom mnca mere i portocale. Vectorii de tip index pot fi utilizai i n combinaie cu diferite expresii. Aceaste expresii trebuie s fie de forma vector[index_vector]. Vectorul asociat trebuie s aib aceiai lungimea ca vectorul index asociat. Dac vectorul asociat este de tip logic atunci el trebuie s fie de aceeai lungime ca vectorul ce l indexeaz. De exemplu, comanda >x[[Link](x)]<-0 nlocuiete orice valoare nedefinit a lui x cu zero. Comanda >y[y<0]<-y[y<0]
3. Creai vectorul x ce conine numerele de la 1 la 30 n ordine cresctoare. Afiai pe ecran elementul 10 al lui x i elementele de la poziia 11 la poziia 15.
Soluie >x<-seq(1:30) >x[10] [1] 10 >x[11:15] [1] 11 12 13 14 15 #creez vectorul x #afiez al 10-lea element #rezultat #afiez elementele de la 11 la 15 #rezultat
elementele lui x de pe poziia 2 i 4 i vectorul y2 care s nu conin elementele lui x de pe aceste poziii. Soluie :x<-c(3,11,8,15,12) >y1<-x[c(2,4) >y1 [1] 11 15 >y2<-x[-c(2,4)] >y2 [1] 3 8 12 #creez vectorul x #vectorul y1 #rezultat #vectorul y2 #rezultat
2.2.
Entitile limbajului R sunt referite, din punct de vedere tehnic, ca obiecte. Vectorii numerici, logici sau de tip caracter, definii n sectiunea precedent, sunt exemple de obiecte R. n R pot fi definiti i vectori de numere complexe. Pe lng vectori, matricele, factorii, listele, tablourile (data frames) i funciile sunt obiecte utilizate uzual n R. Vectorii trebuie s conin elemente de acelai tip (mod). Acestea pot fi numere (reale, ntregi sau complexe), caractere sau simboluri logice. Nu este permis amestecul acestor tipuri n cadrul unui singur vector. Singura excepie de la aceast regul este simbolul NA (not available) or NaN (not a number). Un vector poate s conin doar blank-uri i s aib totui un mod. De exemplu, funcia character() genereaz un vector caracter care conine doar blank-uri. n mod similar funcia numeric() creaz un vector numeric care conine de asemenea blank-uri. Listele sunt alte obiecte din R care opereaz sub modul list. Acestea sunt secvene ordonate de obiecte care individual pot fi de orice tip. Listele sunt cunoscute ca recursive i nu ca structuri atomice cum sunt vectorii. Componentele listelor pot fi ele nsele liste. Funciile i expresiile sunt de asemenea structuri recursive ale limbajului R. Funciile predefinite sunt obiecte care fac parte din sistemul R. Funciile scrise de utilizator sunt de asemenea obiecte R. O proprietate important a unui obiect R este lungimea sa. Funciile length (object) sau mode (object) pot fi utilizate pentru a gsi modul i lungimea unei anumite structuri. De exemplu, dac x este un vector format din 100 de numere reale, atunci funcia mode(x) returneaz irul de caractere numeric iar funcia length(x) numrul 100. Exist posibilitatea de a transforma un obiect de un anumit mod ntr-un obiect de alt mod folosind funcii de forma [Link](). De exemplu, vectorul numeric x, poate fi transformat ntr-un vector de tip caracter folosind funcia [Link](x). Exist o colecie mare de funcii att pentru transformarea modului unui obiect R ct i pentru investirea obiectelor R cu atribute pe care nu le poseda nc. Un obiect R care conine doar blank-uri (empty object) poate avea o lungime definit. De exemplu, comanda >e<-numeric() creaz vectorul numeric e care conine doar blank-uri (empty). n mod similar comanda >v<-character()
creaz vectorul caracter v care conine de asemenea blank-uri (empty). Odat un obiect creat, se pot crea noi componente adugnd un indice n afara intervalului n care a fost iniial definit. De exemplu, dac e este vectorul numeric vid creat anterior comanda >e[3]<-7 va atribui celei de-a treia componente a lui e valoarea 7 iar primelor dou valoarea NA. Aceast regul se aplic la orice structur, cu condiia ca acele componente adiionale s fie de acelai tip cu ale obiectului iniial. Aceast ajustare automat a lungimii unui obiect se utilizeaz foarte des atunci cnd folosim funcia input scan (). Pentru a trunchia mrimea unui obiect este necesar doar o simpla asociere a unui indice. De exemplu dac x este un obiect de lungime 10, atunci comanda >x<-x[1:5] transforma x ntr-un vector de lungime 5 care conine elementele de la 1 la 5 ale vechiului vector x. n mod similar putem reine primele 5 valori ale lui x cu comanda >length(x)<- 5 Funcia attributes(object) returneaz lista tuturor atributelor asociate la un moment dat unui obiect R. Funcia attr([Link]) poate fi utilizat pentru a selecta un atribut specific. De exemplu, dac x este un vector numeric de 10 elemente, secvena urmatoare de comenzi >x <- 1:10 >attr(x,"dim") <- c(2, 5) transform x ntr-o matrice cu dou linii i cinci coloane. n mod similar se pot transforma atributele diferitelor obiecte din R. Toate obiectele din R aparin unei anumite clase. Pentru vectorii simpli clasa poate fi numeric, caracter sau logic. Listele sunt un alt exemplu de clas. Clasa unui obiect se determin cu funcia class() care returneaz caractere precum matrix, array, factor sau [Link]. Obiectele R pot avea i clase definite cu ajutorul anumitor funcii. De exemplu funcia lm() produce obiecte de clasa lm. Cunoaterea clasei obiectului este util pentru programarea orientat pe obiecte . De exemplu dac un obiect are clasa [Link], el va fi interpretat ntr-un anumit mod de ctre funcia plot(). De asemenea funcia summary() va reaciona n acord cu clasa obiectului. Pentru a anula efectele funciei class() se utilizeaz funcia unclass().
PROBLEME
1. Creai vectorul x=(1.1, -7.2, 1.9, -3.4) folosind funcia de concatenare c().
Determinai modul i lungimea vectorului x. Soluie >x=c(1.1, -7.2, 1.9, -3.4) >length(x) [1] 4 >y=[Link](x) >y #creez vectorul x # determin lungimea lui x #rezultat #construiesc vectorul character y cu elementele lui x #afiez pe ecran
#rezultat
3. Creai vectorul numeric x ale crui elemente sunt blank-uri. Atribuii lui x[6]
valoarea 5. Care este lungimea lui x? Care sunt componentele acestui vector? Reducei lungimea lui x la 3. Ce componente obtinei? Soluie >x<-numeric() #creez vectorul vid x >x[6]=5 #atribui valorea 5 lui x(6) >x #afiez vectorul x [1] NA NA NA NA NA 6 #rezultat >length(x) #determin lungimea lui x [1] 6 #rezultat >x<-x[1:3] #reduc lungimea lui x la 3 >x #afiez pe x [1] NA NA NA #rezultat 4. Construii vectorul x care conine irul numerelor ntregi de la 1 la 10. Transformai vectorul x ntr-o matrice de dou linii i 5 coloane. Soluie >x<-seq(1:10) #creez vectorul x >attr(x,"dim") <- c(2, 5) #transform x n matrice >x #afiez x [,1] [,2] [,3] [,4] [,5] #rezultat [1,] 1 3 5 7 9 [2,] 2 4 6 8 10 Observai ordinea n care elementele vectorului au fost trasformate. Se completeaz coloanele n ordine cresctoare.
6. Creai vectorul x=(1,8,5,4) cu ajutorul funciei c(). Determinai clasa vectorilor y1=[Link](x), y2=[Link](x), y3=[Link](x).
Soluie >x=c(1,8,5,4) >y1=[Link](x) >y2=[Link](x) >y3=[Link](x) >class(y1) [1] integer >class(y2) [1] character >class(y3) [1] data frame
#creez vectorul x #creez y1 #creez y2 #creez y3 #determin clasa lui y1 #rezultat #determin clasa lui y2 #rezultat #determin clasa lui y3 #rezultat
2.3.
Factori
Conceptual, factorii in R sunt variabile care iau un numar limitat de valori diferite. Factorii sunt des utilizai n modelarea statistic. Factorii n R sunt reprezentai intern ca valori ntregi 1,2,3,...k, unde k este numrul de niveluri. Funcia factor() este folosit pentru a crea obiecte R de tip factor. Att variabilele numerice ct i cele de tip caracter pot fi transformate n factori. Nivelurile unui factor sunt ntotdeauna iruri de caractere. Factorii pot fi utilizai att pentru ordonarea ct i pentru dezordonarea elementelor vectorilor. Neordonarea este necesar atunci cnd vrem s aranjm elementele unui vector dup o anumit funcie de distribuie. Introducem noiunea de factor printr-un exemplu specific. Presupunem c la o anumit facultate avem 10 studeni care platesc taxe de studii. Aceti studeni sunt identificai prin numele localitaii de unde provin, nume care sunt componetele vectorului de tip caracter nume creeat cu comanda >nume<-c("buc","bras","const","buc","buc","tim","gal","tim","gal","ias") Presupunem c dorim s tim din cte localiti distincte provin studenii considerai n analiza noastr. n acest scop utilizm funcia factor() care selecteaz elementele distincte ale unui vector, numite nivelurile acelui vector. n exemplul nostru comanda >numef<-factor(nume) genereaz obiectul de clasa factor numef. Coninutul lui numef se afieaz pe ecran cu comanda >-numef avnd ca rezultat: [1] buc bras const buc buc tim gal tim gal ias Levels: bras buc const gal ias tim Comanda >levels(numef) genereaz lista localitatilor n ordine alfabetic [1] "bras" "buc" "const" "gal" "ias" "tim" Aranjarea irurilor de caractere n ordine alfabetic se poate face i cu funcia sort().
De o importan deosebit n manipularea factorilor este funcia tapply(). Introducem aceast funie printr-un exemplu simplu. Presupuneam c studenii a cror localitate de origine este dat de vectorul >nume=c("buc","bras","const","buc","buc","tim","gal","tim","gal","ias") beneficiaz de bursele menionate n vectorul >bursa=c(60,49,40,61,64,60,59,54,62,69). Presupunem c suntem interesai s tim valoarea burselor medii i erorilor standard corespunztoare fiecrui ora n parte. n acest scop se folosete funcia tapply(). Mai nti, se calculeaz numef=factor(nume) i apoi se determin bursa medie cu comanda >bursamedie<-tapply(bursa,numef,mean) Rezultatul este bras buc const gal ias tim #nivelurile (oraele distincte n ordine alfabetic) 49.00 61.66 40.00 60.50 69.00 57.00 #bursele medii corespunztoare Funcia tapply() este utilizat aici pentru a aplica o funcie, aici mean(), pentru a grupa componentele primului argument, aici bursa, definit de nivelurile celei de-a doua componente, aici numef, ca i cum ar fi structuri vectoriale separate. Rezultatul este un vector de lungime egal cu numrul nivelurilor. Dac vrem s calculm mai departe eroarea standard a mediei burselor pe orae, determinm variana cu funcia var() i calculm eroarea standard cu >stderr<-function( x ){sqrt(var(x))/length(x)} Comanda >bursaster<-tapply(bursa,numef,stderr) genereaz obiectul bursaster al crui coninut este prezentat mai jos. bras buc const gal ias tim #nivelurile (orae distincte) NA 0.69 NA 1.06 NA 2.12 #eroarea standard Valorile NA corespund cazului n care calculul erorii standard nu a fost posibil deoarece numrul studenilor a fost mai mic sau egal cu unu. Ca un exerciiu se poate calcula nivelul de semnificaie al burselor medii. Trebuie utilizate nc o dat funciile tapply( ) i length() precum i funcia qt() pentru a gsi procentul punctelor distribuiei t corespunztoare. Funcia tapply() poate fi utilizat pentru a efectua operaii cu vectori cu structuri mult mai complicate. Putem complica exemplul de mai sus prin separarea studenilor dup sex i localitate sau dup alte criterii. Pentru fiecare nivel n parte se calculeaz apoi diferite mrimi statistice. Factorii ordonai (ordered factors) se obin practic prin ordonarea nivelurilor. Pentru a creea un factor ordonat, sau pentru a ordona un factor existent se utilizeaz funcia ordered(). Nivelurile unui factor ordonat specific poziia acestora pe o scar ordinar. Pe lng factorii ordonai se utilizeaz i factorii de contrast (factor contrasts). Acetia din urm se utilizeaz deseori n contextul fitrii modelelor matriciale.
PROBLEME
> nume=c(Ion, Vasile, Gelu, Grigore) >numes=sort(nume) >numes [1] "Gelu" "Grigore" "Ion" "Vasile"
2. Studenii participani la o conferin tiinific internaional provin din rile precizate n vectorul tari=(rom,rom,bul,bul,usa,rom,rus,mol,rus,mol,ung). Cu ajutorul funciei factor(), determinai numrul de ri distincte din care provin participanii la conferin.
Soluie >tari=c("rom","rom","bul","bul","usa","rom","rus","mol","rus","mol","ung) #creez vectorul >tarif<-factor(tari) #creez factorul >levels(tarif) #listez nivelurile [1] "bul" "mol" "rom" "rus" "ung" "usa" #rezultat
Bulgaria (bul) i Ungaria (ung). Ordinea intrrii n concurs este ord=(rom, rom, ung,bul, bul,ung,bul,rom,ung,bul) iar punctele corespunztoare ctigate puncte =(10,12,1,7,9,8,10,2,9,1). Calculai punctajul mediu pe fiecare ar.
Soluie >ord=c("rom", "rom", "ung","bul", "bul","ung","bul","rom","ung","bul") #creez vectorul cu care sportivii intr n concurs >puncte=c(10,12,1,7,9,8,10,2,9,1) #punctele obinute >ordf=factor(ord) #calculez factorul >punctemedie=tapply(ordf,puncte,mean) #calculez media de puncte pe tara >punctemedie #afiez punctele medii bul rom ung #rezultatul 6.75 8.00 6.00
4. Stresul la care este supus un grup de pacieni dintr-un spital se ncadreaz in trei
clase: jos, mediu si inalt. Folosind funcia rep() creai factorul [Link]=(jos,mediu, inalt,jos,mediu,inalt). Creai factorul ordonat din factorul [Link] folosind funcia ordered(). Soluie >[Link]<-rep(c("jos","mediu","inalt"),2) #creez [Link] >[Link]=ordered([Link],levels=c("jos","mediu","inalt")) #creez factorul ordonat >[Link] [1] jos mediu inalt jos mediu inalt #rezultat Levels: jos < mediu < inalt > [Link]>="mediu" #stress mai mare sau egal cu nivelul mediu [1] FALSE TRUE TRUE FALSE TRUE TRUE #rezultat
> [Link]<"mediu" #nivel stress mai mic ca mediu [1] TRUE FALSE FALSE TRUE FALSE FALSE #rezultat
2.4.
Matrice
O matrice este un tablou bidimensional ale crui elemente sunt numere. O matrice de n linii i m coloane are dimensiunea n x m. Dimensiunea unei matrice se obine cu funcia dim(). Funciile ncol() i nrow() returneaz numrul de coloane i respectiv numrul de linii al unei matrice. Funcia diag() depinde de argument. Dac v este un vector, diag(v) produce o matrice cu elementele lui v pe diagonal i zero n rest. Dac X este o matrice diag(X) produce un vector cu elementele diagonalei lui M. Dac k este o valoare numeric diag(k) este matricea identitate de dimensiune k x k. Matricele pot fi construite din vectori cu funciile rbind() i cbind(). cbind() formeaz matrice unind vectorii pe orizontal (unul lng cellalt), ori pe coloane, iar rbind() pe vertical (unul sub cellalt), sau pe linii. Aceste funcii pot fi utilizate de asemenea pentru a adauga coloane sau linii noi la matrice deja existente sau pentru a compacta matricile ntre ele. Rezultatul aplicrii funciilor rbind() i cbind() este ntotdeauna o matrice. Elementele unei matrice pot fi extrase individual prin specificarea liniei i a coloanei corespunztoare. De exemplu, dac X este o matrice de dimensiune n x m elementul de pe poziia (i,j) se extrage cu comanda >a=X[i,j] #atribui X[i,j] lui a Toate elementele unei anumite coloane, j, se pot scrie ntr-un vector folosind comanda >v=X[,j] #elementele coloanei j sunt scrise n vectorul v n mod similar elementele liniei i se scriu n vectorul v cu comanda >v=X[i,] #elementele liniei i sunt scrise n vectorul v Se pot extrage i blocuri ale matricei X care apoi sunt scrise n matrice de dimensiuni mai mici. De exemplu, comanda >XX=X[i1:i2,j1:j2] genereaz matricea de dimensiune (i2-i1+1 x j2-j1+1) ale crei elemente sunt elementele matricei X din liniile i1, i1+1, ..i2 i j1. j1+1,...j2. Elementele unei matrice pot fi manipulate cu ajutorul funciei array(). Urmtorul exemplu ne ajut s nelegem modul de utilizare al acestei funcii. Fie X o matrice de 4 linii i 5 coloane. Presupunem c vrem s extragem elementele X[1,3], X[2,2], i X[3,1] i s le punem ntr-un vector y iar n locul lor n matricea X s punem valoarea 0. Generm mai nti matricea X. >X<-array(1:20, dim=c(4,5)) iar apoi vectorul de selecie, >i<-array(c(1:3,3:1),dim=c(3,2)) Elementele dorite ale lui X, adic X[1,3], X[2,2], i X[3,1], se extrag simplu cu comanda >X[i] Elementele extrase ale lui X se completeaza apoi cu zero. >X[i]<-0 Nu sunt permii indici negativi. Liniile indexate cu zero sunt ignorate.
Limbajul R permite efectuarea operaiilor cu matrice. Mai jos sunt listate cteva operaii matematice care se pot efectua n R cu dou matrice oarecare, A i B, de dimensiuni compatibile. >A%*%B #produsul (dup definiia din algebra liniar) >A*B #produsul element cu element >A+B #suma element cu element >A-B #diferen element cu element >A/B #mparire element cu element n cursul acestor operaii pot rezulta elemente de tipul NA, NaN or Inf. Acestea pot fi identificate cu funcii specializate cum ar fi [Link](). Inversa unei matrice se calculeaz simplu, folosind funcia solve(). Dac A este o matrice ptratic nesingular, atunci inversa AI se determin cu comanda >AI=solve(A) Se pot rezolva uor ecuaii matriceale folosind funcia solve(). Vectorii i valorile proprii ale unei matrice simetrice se calculeaz cu ajutorul funciei eigen(). Rezultatul acestei funcii este o list care conine vectorii i valorile proprii ale matricei analizate. Un exemplu de calcul al vectorilor i valorilor proprii ai unei matrice simetrice SM este dat de secvena de comenzi de mai jos. >e=eigen(SM) #calculez vectorii i valorile proprii ai lui SM (i rezultatul este pus n lista e) >eva=e$val #extrag din list vectorul valorilor proprii >eve=e$vec #extrag din list matricea vectorilor proprii Alternativ, se pot calcula direct valorile sau vectorii proprii cu urmatoarea secven de comenzi: >eva<-eigen(SM)$values #valorile proprii >eve<-eigen(SM)$vec #vectorii proprii Pentru matrice mari este bine s evitm calcularea vectorilor proprii dac nu este strict necesar. n acest caz se utilizeaz comanda >eva<-eigen(SM,[Link]=TRUE)$values Descompunerea n valori singulare (SVD-singular value decomposition) este o alt operaie care se poate efectua n R. Funcia svd(M) calculeaz SVD-urile matricei M. Acestea constau dintr-o matrice ortonormal U cu acelai numr de coloane ca M, o matrice ortonormal V n care numrul de coloane este egal cu numrul de linii ale lui M i o matrice diagonal D de numere pozitive astfel inct M=U%*%D%*%t(V). Funcia svd() returneaz un vector ce conine elementele diagonalei matricii D. Exist multe alte operaii cu matrice care se pot efectua uor n R. Acestea vor fi prezentate gradual n contextul analizei statistice a diferitelor date.
PROBLEME
1. Se d vectorul x=(1,2,3,4,5,6). Folosind funcia dim() transformai vectorul x ntro matrice de 2 linii i 3 coloane. Scriei elementele coloanei 1 ntr-un vector y1 i elementele liniei 2 ntr-un vector y2 i afiai coninutul acestor vectori pe ecran. Soluie >dim(x)<-c(2,3) #transform vectorul x n matrice 2x3 >y1=x[,1] #scriu prima coloana n vectorul y1
cresctoare. Transformai vectorul x ntr-o matrice cu patru linii i patru coloane folosind funcia dim(). Scriei elementele x[1,1], x[1,4], x[4,1] i x[4,4] ntr-o matrice de dimensiune 2x2. Soluie >x=seq(1:16) #construiesc vectorul x >dim(x)=c(4,4) #transform x n matrice 4x4 >vc=c(1,4) #vectorul selectie coloana >vl=c(1,4) #vectorul selectie linie >m=x[vl,vc] #selectez elementele specificate n vl i vc >m #listez m [,1] [,2] #rezultat [1,] 1 13 [2,] 4 16 1 5 3 7 A= B= 2 6 4 8 i . Compactai A i B utiliznd funciile 3. Se d matricea
cbind() i rbind(). Soluie >C<-rbind(A,B) >C [,1] [,2] [1,] 1 5 [2,] 2 6 [3,] 3 7 [4,] 4 8 >D=cbind(A,B) >D [,1] [,2] [,3] [,4] [1,] 1 5 3 7 [2,] 2 6 4 8
1 5 A= 2 6 . Adugai o coloan la A care s conin numrul 10. 4. Se d matricea Adugai o linie la A care s conin numrul 20. Soluie >B=cbind(10,A) #se adaug o coloana cu cifra 10 >B #afiez rezultatul [,1] [,2] [,3] #rezultat
folosind funcia dim(). Creai un vector care s conin elementele X[1,3], X[2,2] i X[3,1]. Soluie >X<-seq(1:100) #creez irul 1-100 >dim(X)=c(10,10) # transform X n matrice >i<-array(c(1:3,3:1),dim=c(3,2)) #vectorul de ordine >y=X[i] #creez vectorul cu elementele extrase >y #afiez pe ecran selecia [1] 21 12 3 #rezultatul
Dac lungimea vectorului v este mai mica dect 24 atunci valorile vor fi ciclate pn cnd toate cele 24 de poziii vor fi completate. Comanda >X<-array(0,c(3,4,2)) genereaz un tablou de dimensiune (3,4,2) ale crui elemente sunt egale cu zero. Tablourile pot fi utilizate n diferite operaii aritmetice, multe dintre acestea fiind similare celor descrise pentru matrice. Se pot efectua de asemenea operaii ntre tablouri numerice i alte obiecte R cum ar fi vectorii sau matricele. Dac A i B sunt dou tablouri numerice atunci produsul lor exterior (outer product) va fi un tablou numeric ale crui elemente se obtin prin formarea tuturor combinaiilor posibile ale elementelor lui A i B. Simbolul pentru acest tip de produs este %0%. >AB<-A%0%B sau echivalent >AB<-outer(A,B,*) De remarcat c produsul definit de simbolul %*% este diferit de produsul reprezentat prin simbolul %0%. Funcia aperm() poate fi utilizat pentru a permuta dimensiunile unui tablou numeric. Argumentul perm este o permutare de numere ntregi {1,2,,k} unde k este numrul de indici ai tabloului numeric. Rezultatul acestei funcii este un tablou numeric de aceeai dimensiune dat de perm[j] care devine noua j-dimensiune. Cel mai uor este s vedem aceast instruciune ca pe o transpus generalizat. Dac A este o matrice atunci, >B<-aperm(A,c(2,1)) este transpusa lui A. Pentru acest caz simplu exist funcia t() care transpune direct matricea A >B<-t(A)
PROBLEME
vectorul x care conine numerele de la 1 la 18 n ordine cresctoare. Soluie >x<-seq(1,18) #creez vectorul x >X<-array(x,dim=c(3,3,2)) #creez tabloul X >X #afiez pe ecran coninutul ,,1 #rezultat [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9 ,,2 [,1] [,2] [,3] [1,] 10 13 16 [2,] 11 14 17 [3,] 12 15 18
2. Se d vectorul x=(1,2,3,4,5,6). Cu ajutorul funciei dim() transformai acest vector ntr-o matrice de 2 linii i trei coloane. Soluie >x<-c(1,2,3,4,5,6) #creez vectorul x >dim(x)=c(2,3) #transform x n matrice 2x3 >x #afiez x [,1] [,2] [,3] #rezultat [1,] 1 3 5 [2,] 2 4 6 3. S se transforme vectorul numeric x=(1,2,3,4,5,6,7,8) ntr-un tablou de
dimensiune 2x2x2. Soluie >x=c(1,2,3,4,5,6,7,8) >t<-array(x,dim=c(2,2,2)) >t ,,1 [,1] [,2] [1,] 1 3 [2,] 2 4 ,,2 [,1] [,2] [1,] 5 7 [2,] 6 8 #creez vectorul x #creez tabloul t de dim 2x2x2 #afiez t #rezultat
dou linii i dou coloane cu ajutorul funciei dim(). Calculai x%*%y i x*y. Soluie. >x=c(1,2,3,4) #creez vectorul x >y=c(5,6,7,8) #creez vectorul y >dim(x)=c(2,2) #creez matricea x >dim(y)=c(2,2) #creez matrice y >p1=x%*%y #produsul lui x cu y >p1 #scriu pe ecran rezultatul [,1] [,2] #rezultat [1,] 23 31 [2,] 34 46 >p2=x*y #produsul (element cu element) al lui x cu y >p2 #afiez pe ecran rezultatul [,1] [,2] #rezultat [1,] 5 7 [2,] 6 8 5. Se dau vectorul x=(1,2,3,4,5,6,7,8) i vectorul y=(9,10,11,12,13,14,15,16). S se transforme aceti vectori n tablouri de dimensiune 2x2x2 cu ajutorul funciei array(). Efectuai produsul t1*t2 i t2*t1.
Soluie >t1=array(x,dim=c(2,2,2)) >t2=array(y,dim=c(2,2,2)) >p1=t1*t2 >p1 ,,1 [,1] [,2] [1,] 9 33 [2,] 20 48 ,,2 [,1] [,2] [1,] 65 105 [2,] 84 128 >p2=t2*t1 >p2
2.6.
O list n R este o colecie de obiecte ordonat dup anumite criterii. Aceste obiecte se numesc componentele listei. Componentele unei liste nu sunt n mod necesar de aceeai clas. Acestea pot fi vectori numerici, logici sau caracter, matrice, funcii etc. Exemplul urmtor arat modul n care se poate crea o list. Presupunem c familia Popescu este format din cinci membri, tatl Ion, soia Maria i trei copii Ion, Vasile i Andrea n vrst de 4, 7 i respectiv 9 ani. Aceast informaie poate fi stocat n lista Lst construit cu ajutorul comenzii
>Lst<-list(nume=Ion, sotie=Maria, [Link]=3, [Link]=c(4,7,9)) Componentele listei sunt ntotdeauna numerotate i pot fi identificate dup indicele corespunzator. n cazul nostru Lst este numele unei liste cu patru componente care pot fi identificate individual prin Lst[[1]], Lst[[2]], Lst[[3]] i Lst[[4]]. Dac Lst[[4]] este un vector, de exemplu, atunci Lst[[4]][1] este primul element al acestui vector. Lungimea listei, adic numrul de obiecte din lista respectiv, se obine cu funcia >length(nume_lista) #nume_lista este Lst n cazul nostru Componentele listei pot fi de asemenea denumite. Ele pot fi apelate fie dup nume, care sunt iruri de caractere ntre dou paranteze ptrate, fie prin expresii de forma > nume_lista$numele_componentei_listei A doua variant este cel mai des utilizat. n cazul exemplului de mai sus Lst$nume este echivalent cu Lst[[1]] i este irul de caractere Ion. Lst$sotie este echivalent cu Lst[[2]] i este irul de caractere Maria. Lst$[Link][1] este echivalent cu Lst[[4]][1] i este numrul 4. Se poate de asemenea utiliza numele componentelor listelor scrise ntre paranteze patrate. De exemplu, Lst[[nume]] este echivalent cu Lst$nume. Este important s facem distincie ntre Lst[[1]] i Lst[1]. Operatorul [[..]] este utilizat pentru a selecta un singur element n timp ce [..] este un operator de indexare general. Astfel, [[..]] este o component a listei Lst. [..] este o sublist a listei Lst constnd doar din primul element. Este o list denumit i numele este transferat acestei subliste. Numele componentelor listelor pot fi prescurtate la un numr minim de caractere pe care le poate identifica n mod unic. Astfel Lst$coefficients este echivalent cu Lst$coe iar Lst$covariance cu Lst$cov. Liste noi pot fi construite din obiecte R deja existente cu ajutorul funciei list(). De exemplu o list de m obiecte poate fi generat cu o comand de tipul >Lst<-list(name_1=object_1,.......,name_m=object_m) unde object_1,object_m sunt cele m componente ale listei. O list format dintr-un anumit numr de obiecte poate fi extins prin specificarea numelor componentelor adiionale. De exemplu,lista din exemplul precedent, care era format din patru componente, poate fi extins la 5 prin adugarea numelui prietenilor de familie >Lst[5]<-list(prieteni=nume_prieteni) Listele pot fi concatenate cu ajutorul funciei c(). Rezultatul este tot o list care conine listele iniiale drept componente. Un exemplu de comand de acest fel este >[Link]<-c(list.A,list.B,list.C) Un tablou de date (data frame) este o un obiect R mai general dect o matrice n sensul c coloanele pot avea clase diferite. Toate elementele unei coloane trebuie s aparin uneia dintre clasele: numeric, factor, caracter sau logic. Nu se admit obiecte de clase diferite pe aceai coloan. Tablourile de date pot fi vzute i ca liste de clasa data frame. Practic tablourile de date sunt liste care satisfac anumite criterii. Componentele tablourilor de date pot fi vectori (numerici, caracter sau logici), factori, matrice numerice, liste sau alte tablouri de date. R are o mulime de faciliti de creare i manipulare a tablourilor de date. Un mod simplu de a accesa un tablou de date n spaiul de lucru este citirea acestuia dintr-un fiier
cu ajutorul funciei [Link](). Aceast funcie va fi descris n capitolul urmtor. Unele obiecte R, ca de exemplu vectorii sau matricele, pot fi privite ca tablouri de date. Funcia [Link]() poate fi utilizat de asemenea pentru a transforma vectorii, matricele i alte obiecte R compatibile n tablouri de date. Funcia attach() permite accesul diferite tablourile de date care nu sunt accesibile implicit odat cu lansarea n execuie a lui R.. Opusul acestei funcii este detach(). Funciile colnames() i rownames() sunt utilizate pentru a denumi coloanele i respectiv liniile unui tablou de date cu ajutorul irurilor de caractere. Funciile head() i tail() permit afiarea pe ecran a primelor i respectiv ultimelor cteva linii ale unui tablou de date. Functia stack() concateneaz coloanele succesive ale unui tablou. Operaia invers este realizat de funcia unstuck(). Alte funcii des utilizate atunci cnd lucrm cu tablouri de date sunt agregate(), merge(), reshape() i split(). Detalii despre modul de utilizare al acestora pot fi obinute cu ajutorul funciei help().
PROBLEME
trei copii n vrst de 3, 5 i respectiv 7 ani. Creai o list care s conin aceast informaie. Vizualizai vrsta copiilor din lista nou creat. Soluie >Lst<-list(nume_sot=Ion,nume_sotie=Ioana,numr_copii=3, virsta_copii=c(3,5,7)) #creez lista >Lst[[1]] #afiez primul element [1] Ion #rezultat >Lst[[2]] #afiez al doilea element [1] Ioana #rezultat >Lst[[3]] #afiez al treilea element [1] 3 #rezultat >Lst[[4]] #afiez al patrulea element [1] 3 5 7 #rezultat Alternativ se pot lista componentele listei ca Lst$nume_sot, Lst$nume_sotie, Lst$virsta_copii, Lst_numr_copii.
trei persoane. Greutatea corespunztoare a acestor persoane se afl n vectorul g=(55,74,100) iar nivelul studiilor n vectorul de tip caracter studii=(superioare, medii,superioare). Scriei ntreaga informaie ntr-un tablou de date. Soluie >informatii<-[Link](nume=nume, greutate=g, studii=studii) #creez tabloul >informatii #listez coninutul nume greutate studii #rezultat 1 Ion 55 superioare 2 Gheorghe 74 medii 3 Costel 100 superioare
2.7.
PROBLEME
Soluie >x1=c(1,7,9) #creez vectorul x1 >x2=c(2,4,8) #creez vectorul x2 >{x1+x2;x1-x2} [1] -1 3 1 #rezultat Observai c se returneaz valoarea ultimei expresii, in cazul nostru x1-x2.
PROBLEME
poziiile valorilor negative ale elementelor vectorului x. Soluie >x<-c(1,2,-3) #creez vectorul numeric x >y<-x<0 #creez vectorul logic y [1] FALSE FALSE TRUE #vectorul y >if(y[1]){print(1)} #testez dac prima valoare e negativ >if(y[2]){print(2)} #testez dac a doua valoare e negativ >if(y[3]){print(3)} #testez dac a treia valoare e negativ [1] 3 #rezultat
>x=c(-1,1) >y=x>=0 y [1] FALSE TRUE >if(y[1]){print("x[1]>=0")} else {print("x[1]<0")} [1] "x[1]<0 >if(y[2]){print("x[2]>=0")} else {print("x[2]<0")} [1] "x[2]>=0"
#creez vectorul x #creez vectorul logic #vectorul y #condiie #rezultat #condiie #rezultat
lui y pe poziia elementelor negative ale lui x i elementele lui x pe poziia elementelor mai mari sau egale cu zero ale lui x. Soluie >x=c(-1,1) #creez vectorul x >y=c(3,4) #creez vectorul y >l=x<0 #creez vectorul logic l [1] TRUE FALSE #vectorul l >v<-ifelse(l,y,x) #creez vectorul v [1] 3 1 #vectorul v
2.7.3. Bucle
Buclele sau execuiile repetate ale comenzilor R se realizeaz cu ajutorul funciilor for(), repeat() i while(). Apelarea funciei for() se face prin >for(name n expr_1) expr_2 unde name este variabila care cicleaz. expr_1 este o expresie vectorial (deseori o secven de tipul 1:n) iar expr_2 este o grupare de comenzi R. O alt posibilitate de a executa repetat o grupare de comenzi este utilizarea funciei repeat() care se apeleaz cu comanda >repeat expr unde expr este o expresie. O alt funcie care permite introducerea condiiilor n execuia comenzilor R este while() care se apeleaz prin >while (condition) expr Expresia expr este evaluat atta timp ct condiia condition este satisfacut. n asociere cu funciile de ciclare menionate mai sus se folosete i funcia break() pentru a termina, adeseori anormal, un ciclu. De fapt aceasta este singura posibilitate de a ncheia bucla generat cu funcia repeat(). Comanda next poate fi utilizat pentru a termina un anumit ciclu i a sri la urmatorul.
PROBLEME
1. Utiliznd funcia for creai vectorul numeric v care s conin numerele ntregi de la 1
la 10. Soluie >v=vector() >for(i in 1:10){ v[i]=i} >v [1] 1 2 3 4 5 6 7 8 9 10 #definesc vectorul v #bucla #afiez v #rezultat
2. Utilizai funcia while() pentru a scrie primele 4 elemente ale vectorului v din problema precedent ntr-un alt vector v1. Soluie >v1=vector() #definesc vectorul v1 >i=1 #iniializez indicele >while(v[i]<5){v1[i]=v[i];i=i+1} >v1 #afiez v1 [1] 1 2 3 4 #rezultat
2.8. Funcii
order() print() range() sort() rev() str() unique() which() [Link]() [Link]() with() specificat
#ordoneaz un ir (NA pe ultima poziie) #printeaz un singur obiect #maximul i minimul elementelor unui vector #ordoneaz cresctor elementele unui vector(se omite NA ) #aranjaza elementele unui vector n ordine invers #informaii despre un obiect R #formeaz un vector cu valori distincte #localizeaz indicii TRUE ai unui vector logic #localizeaz indicele maximului unui vector numeric #localizeaz indicele minimului unui vector numeric #efectueaz calcule utiliznd coloanele unui tablou de date
Pe lng funciile prezentate mai sus exist multe alte funcii nglobate n R. Informaii despre aceste funcii se pot obine cu funcia help(). O parte din funciile nglobate n R recunosc valorile nedefinite. Exist ns i funcii care returneaz un mesaj de eroare sau NA dac datele furnizate ca input conin valori nedefinite. De exemplu, opiunea implicit (default) a functiilor mean(), sum(), median(), range(), returneaz NA cnd sunt aplicate vectorilor n care una sau mai multe valori sunt NA. Setarea argumentului [Link]=TRUE a acestor funcii are ca efect neglijarea valorilor NA i evaluarea mrimilor cerute cu elementele ramase. De exemplu >mean(c(1,NA,3,0,NA),[Link]=TRUE) #media aritmetic [1] 1.3 #rezultat Alte funcii utile n manipularea valorilor NA sunt [Link]() i [Link](). Informaii suplimentare se pot obine cu help([Link]) i help([Link]).
PROBLEME
1. Se dau vectorii numerici x=(1,7,12,NA) i y=(2,NA,3,7). Calculai vectorul z=x+y. Sunt toate valorile lui z NA? Exist cel puin o valoare a lui z egal cu NA? Soluie >x<-c(1,7,12,NA) #creez vectorul x > y<-c(2,NA,3,7) #creez vectorul y >z<-x+y #suma lui x i y >l<-[Link](z) #creez vectorul logic l [1] FALSE TRUE FALSE TRUE #vectorul l >all(l) #sunt toate valorile nedefinite ? [1] FALSE #rezultat >any(l) #exist cel puin o valoare nedefinita? [1] TRUE #rezultat 2. Utilizai precedent. Soluie >cat(x)
funcia cat() pentru a vizualiza vectorii x, y i z din problema
obiect, este cea din linia final a corpului funciei. Dac rezultatul const i cteva obiecte de diferite tipuri, atunci acestea se compacteaz de obicei ntr-o list.
PROBLEME
ir de numere. Calculai media si deviaia standard a irurilor de numere x1=(1,7,3,8,1,15) i x2=(1,8,7,5,NA,6,NA). Soluie >meanANDsd<-function(x){ #definesc funcia av<-mean(x) #media sdev<-sd(x) #deviaia standard c(mean=av,SD=sdev)} #compactez av i sdev ntr-un vector >x1=c =(1,7,3,8,1,15) #creez vectorul x1 >meanANDsd(x1) #aplic funcia mean SD #rezultat 5.833333 5.382069 >x2=c=(1,8,7,5,NA,6,NA) #creez x2 >meanANDsd(x2) #aplic funcia mean SD NA NA
returneaz rezultatul sub forma unei liste. Aplicai aceast funcie pentru calculul sumei si diferenei vectorilor x=(1,7,9) si y=(2,8,4). Soluie >myf<-function(x,y){ #definesc funcia s=x+y #suma d=x-y #diferena list(suma=s,diferenta=d)} #creez lista >x=c(1,7,9) >y=c(2,8,4) >rez=myf(x,y) #aplic funcia >rez #rezultat $suma [1] 3 15 13
3. Creeai funcia myf pentru calculul sumei si a diferenei a doi vectori care
$diferenta [1] -1 -1 5