100% au considerat acest document util (1 vot)
175 vizualizări42 pagini

RStudio

Documentul prezintă limbajul R și motivele pentru care ar trebui utilizat. Descrie instalarea R, directorul de lucru și comanda help() pentru obținerea de informații despre funcții. De asemenea, explică probleme simple pentru înțelegerea conceptelor de bază ale R.

Încărcat de

Lucian Slimm
Drepturi de autor
© Attribution Non-Commercial (BY-NC)
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
100% au considerat acest document util (1 vot)
175 vizualizări42 pagini

RStudio

Documentul prezintă limbajul R și motivele pentru care ar trebui utilizat. Descrie instalarea R, directorul de lucru și comanda help() pentru obținerea de informații despre funcții. De asemenea, explică probleme simple pentru înțelegerea conceptelor de bază ale R.

Încărcat de

Lucian Slimm
Drepturi de autor
© Attribution Non-Commercial (BY-NC)
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd

1.

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

1. Vizitai site-ul oficial al proiectului R de la adresa [Link]


Enumerai cteva manuale de utilizare ale lui R existente pe acest site. Soluie Manualele de introducere n R disponibile pe acest site la data de 14 Septembrie, 2010 sunt: - An Introduction to R - R language definitions - Writing R extensions #prezint o introducere n R #prezint detalii ale procesului de evaluare a expresiilor n limbajul R. #prezint modul n care un utilizator

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

1. Instalai ultima variant executabil (binar) a sistemului R pe calculatorul

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.

precedent. Prsii aceast sesiune fr a o salva. Soluie

2. Deschidei o sesiune R interactiv folosind programul R instalat n problema


Se acioneaz click de dou ori pe iconia sistemului R de pe desktop. Rezultatul este apariia pe ecran a mesajului prezentat n text i al prompterului >. Pentru a prsi sesiunea, se d comanda >q() i apoi se acioneaz clickpe opiunea No a csuei ce apare pe ecran.

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.

Alte caracteristici ale sistemului R

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

1. Pentru scrierea pe ecran a irului de caractere numele meu este Popescu se

2. R poate fi utilizat i ca un calculator de buzunar. Efectuai urmtoarele calcule


aritmetice: 7.2+4.1; 5.3-8.21; 8.25*2.25; 7.25/8.42 i radical din 2.13. Soluie >7.2+4.1 [1] 11.3 #adunare #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

#scdere #rezultat #nmulire #rezultat #mprire #rezultat #radical #rezultat

n mod similar se pot efectua toate operaiile aritmetice permise de un calculator de buzunar.

3. n problema precedent numerele reale rezultate din calculele aritmetice au fost


Soluie >options(digits=2) >7.25/8.42 [1] 0.86

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

4. Presupunem c ntr-o sesiune R n spaiul de lucru se afl doar vectorul numeric


x=(7,9,12,15). Salvai acest obiect in directorul C:/LUCRU1 folosind functia save(). ncrcai acest obiect intr-o sesiune nou folosind funcia load(). Soluie Se lanseaz sistemul R acionnd ,,click pe iconia corespunztoare de pe desktop. Dup apariia prompterului < se vor executa comenzile de mai jos. >x<-c(7,9,12,15) #creez vectorul x >save(x,file=C:/LUCRU1/[Link]) #salvez vectorul x in fisierul [Link] >q() #prsesc sesiunea R Deschid o nou sesiune R. >load((C:/LUCRU1/[Link]) #ncarc fiierul [Link] >x #afiez coninutul lui x [1] 7 9 12 15 #rezultat

2.
2.1.

ELEMENTELE DE BAZ ALE LIMBAJULUI R

Calcule simple. Numere i vectori

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.

2.1.1. Construirea interactiv i operaii simple cu vectori numerici


R opereaz cu structuri de date. Cele mai simple structuri sunt vectorii numerici, adic succesiuni de numere aranjate ntr-o anumit ordine. Aceste structuri pot fi create interactiv sau importate din fiiere. n continuare, vom prezenta prin intermediul ctorva exemple modul n care vectorii numerici se pot crea i manipula interactiv. Vectorul x format din numerele 1,2,3 i 4 se creaz cu ajutorul comenzii >x<-c(1,2,3,4) unde c() este funcia de concatenare. Aceast funcie este larg utilizat n R pentru agregarea diferitelor obiecte. Simbolul <- este echivalentul semnului egal. Acelai rezultat se obine dac se folosete funcia assign() prin comanda >assign(x,c(1,2,3,4)) Aa cum se observ mai sus, operatorul <- este practic scurttura (short-cut) funciei assign(). Pentru a afia pe ecran elementele vectorului x se execut comanda >x [1] 1 2 3 4 #rezultat Limbajul R permite efectuarea interactiv a diferitelor operaii cu vectori. De exemplu, comanda >y<-1/x are ca efect crearea vectorului y de aceeai lungime ca vectorul x ale crui elemente sunt 1/x. Coninutul vectorului y este afiat pe ecran prin comanda >y [1] 1 0.50 0.33 0.25 # rezultat Utiliznd funcia de concatenare c() se pot construi vectori de dimensiuni mai mari prin concatenarea mai multor vectori de dimensiuni mai mici. De exemplu, vectorul z obinut prin concatenarea vectorilor x i y se obine cu comanda >z<-c(x,y) #concatenez vectorii x i y >z #afiez elementele vectorului z [1] 1 2 3 4 1 0.50 0.33 0.25 #rezultat Elementele vectorilor numerici sunt numerele reale. Aceti vectori pot fi utilizai n expresii aritmetice. Fiecare element al acestui vector este calculat din elementele corespunz-toare ale vectorilor care intr n expresia aritmetic. Vectorii care apar ntr-o

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

1. Construii interactiv vectorii numerici x=(1,3,5), y=(10,12,14) i z=(20,21,22).


Apoi construii i vizualizai vectorul w obtinut prin concatenarea vectorilor x, y i z definii anterior. Soluie >x=c(1,3,5) >y=c(10,12,14) >z=c(20,21,22) >w=c(x,y,z) >w [1] 1,3,5,10,12,14,20,21,22 #creez vectorul x #creez vectorul y #creez vectorul z #creez vectorul w #afiez pe ecran w #rezultat

2. Fie vectorul x=(4,8) i y=(2,4). Calculai x+y, x/y, x*y,x-y i x^y.


Soluie >x=c(4,8) >y=c(2,4) >x+y [1] 6 8 >x/y [1] 2 2 >x*y [1] 8 32 >x-y [1] 2 4 #creez vectorul x #creez vectorul y #adun x cu y i afiez pe ecran rezultatul #rezultat #mpart y la x i afiez rezultatul #rezultat #nmultesc x cu y i afiez pe ecran #rezultat #scad y din x i afiez pe ecran #rezultat

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

2.1.2. Generarea secvenelor regulate


R dispune de o serie de faciliti pentru generarea secvenelor de numere organizate ca vectori sau matrice. Prezentm aceste faciliti prin intermediul ctorva exemple. Vectorul v coninnd numerele de la 1 la 30 se genereaz cu comanda >v<-1:30 n mod similar, comanda >v<-30:1 genereaz secvena numerelor de la 30 la 1 cu pasul 1 i salveaz aceast secven n vectorul v. n mod similar se pot genera secvene variate de numere care apoi pot fi utilizate n diferite calcule. De exemplu succesiunea de comenzi de mai jos genereaz vectorul v ale crui elemente sunt numerele de la unu la 9. >n<-10 #n=10 >v<-1:n-1 #generez secvena 1-9 >v #vizualizez vectorul v [1] 1 2 3 4 5 6 7 8 9 #rezultat Funcia seq() se folosete pentru a genera secvene de numere. Aceast funcie se apeleaz cu comanda >seq(from, to, by ...) Primele dou argumente specific nceputul i sfritul secvenei (from i to) iar ultimul specific pasul (by). Funcii nrudite cu seq() sunt [Link](),i seq_len(). Mai jos sunt cteva exemple de utilizare a funciei seq(). >v5<-seq(2,10) #generez secvena de numere de la 2 la 10 i o afiez pe ecran [1] 2 3 4 5 6 7 8 9 10 #rezultat >seq(from=2,to=10) #generez secvena de numere de la 2 la 10 i o afiez pe ecran [1] 2 3 4 5 6 7 8 9 10 #rezultat >seq(-5,5,by=2) #generez secvena de la -5 la 5 cu pasul 2 i o afiez pe ecran [1] -5 -3 -1 1 3 5 #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

1. S se creeze vectorul x=(1,7,8). Folosind funcia rep() s se creeze vectorii


y1=(1,7,8,1,7,8), y2=(1,1,7,7,8,8) i y3=(1,7,8,0,1,1,8). Soluie >x<-c(1,7,8) #creez vectorul x >y1=rep(x,times=2) #creez vectorul y1 >y2=rep(x,each=2) #creez vectorul y2 >y3=c(x,0,x) #creez vectorul y3 Se vizualizeaz pe ecran rezultatul prin scrierea numelui fiecrui vector n linia de comand i apoi apsarea tastei ENTER.

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

3. Construii secvena de numere 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5. Folosind operatorul


%in% extragei elementele egale cu 2 si 4 si punei-le n vectorul y. Creai vectorul z care sa aib 0 pe poziiile unde nu avem 2 si 4. Soluie >x<-rep(1:5,rep(3,5)) >y<-x[x%in%c(2,4)] >y [1] 2 2 2 4 4 4 >z=match(x,c(2,4),nomatch=0) >z [1] 0 0 0 1 1 1 0 0 0 2 2 2 0 0 0 #creez secvena #calculez vectorul y #rezultat

#rezultat

2.1.3. Vectori logici


Elementele unui vector logic sunt succesiuni de TRUE (adevrat), FALSE (fals) i NA (not available-nedisponibil). Deseori TRUE se abreviaz cu T iar FALSE cu F. Este de dorit utilizarea lui TRUE i FALSE n loc de T i F deoarece este posibil ca T sau F s fie variabile deja definite. Vectorii logici sunt generai atunci cnd se impun anumite condiii. De exemplu, dac punem condiia ca elementele vectorului x =(-2,7,9) s fie pozitive, putem genera vectorul logic FALSE,TRUE, TRUE cu secvena de comenzi de mai jos. >x<-c(-2,7,9) >y<-x>0 Primul element al lui x este mai mic dect zero i condiia nu este ndeplinit (FALSE) iar ultimele dou sunt pozitive i deci condiia este ndeplinit (TRUE). Pe lng operatorul mai mare (simbolul >), din exemplul de mai sus, mai pot fi folosii i ali operatori logici cum ar fi < (mai mic), <= (mai mic sau egal), == (identic) sau !=(diferit). Dac c1 i c2 sunt expresii logice, atunci c1&c2 reprezint intersecia lor (and) iar c1|c2 este reuniunea lor (or) iar !c1 este negaia lui c1. Informaii suplimentare despre operatorii menionai mai sus i ali operatori logici pot fi obinute cu comenzile help(Logic), help(Comparison) sau help(Syntax). Vectorii logici pot fi utilizai n operaii aritmetice. n acest caz, ei se transform n vectori numerici, FALSE devenind 0 iar TRUE devenind 1. Funcia utilizat n acest scop este [Link]().

PROBLEME

1. Creai vectorul x=(-1,7,4,-2,9). Determinai vectorul logic corespunzator condiiei


ca elementele lui x s fie pozitive. Soluie >y<-x>0 >y [1] FALSE TRUE TRUE FALSE TRUE #creez vectorul logic y #afiez pe ecran pe y #rezultat

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

2.1.4. Valori nedefinite


n anumite cazuri, componentele unui vector nu sunt cunoscute n totalitate. Cnd un element al unui vector nu este disponibil sau este nedefinit n sens statistic, n locul lui se pune o valoarea speciala NA (not available). n general, orice operaie cu NA genereaz tot un NA. Exist ns i funcii care pot fi calculate chiar dac datele de intrare conin valori nedefinite. Funcia [Link](x) genereaz un vector logic de aceeai lungime ca x cu valoarea TRUE dac i numai dac elementul corespunzator al lui x este NA. Un exemplu de utilizare a funciei [Link]() este dat mai jos: >z<-c(1:3,NA) #creez vectorul z > ind<-[Link](z) #creez vectorul logic ind >ind #afiez pe ecran vectorul ind [1] FALSE FALSE FALSE TRUE #rezultat Un alt tip de valoare nedefinit este NaN (not a number). Ea apare de exemplu n cazul operaiilor de tipul 0/0 sau cnd rezultatul unei expresii este infinit (Inf). [Link](x) genereaz TRUE att pentru NA ct i pentru NaN. [Link](x) genereaz TRUE doar pentru NaN.

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

1. Se d vectorul x1=(1,0,1) i vectorul x2=(0,0,1). Generai vectorul y1=x1/x2 i

>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[![Link](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

2.1.5. Vectori de tip caracter


Vectorii de tip caracter sunt utilizai frecvent n aplicaii grafice sau tabele. Ei sunt secvene de caractere delimitate de ghilimele . De exemplu, x-values, new iterations sunt vectori de tip caracter. Caracterele sunt introduse utiliznd fie simbolul

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

2. Numele a patru studeni participani la un concurs sunt Vasile, Radu, Ilinca i


Aron. Aranjai aceste nume n ordine alfabetica folosind funcia sort(). Soluie >nume<-c(Vasile,Radu,Ilinca,Aron) >sort(nume) [1] "Aron" "Ilinca" "Radu" "Vasile" #vectorul nume #rezultat

2.1.6. Selectarea elementelor vectorilor. Vectori index


Submulimi de elemente pot fi selectate prin asocierea vectorilor de tip index. Acetia pot fi de patru tipuri: logici, de numere ntregi pozitive, de numere ntregi

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[![Link](x)] De asemenea, comanda >(x+1)[(![Link](x))&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]

are acelai efect ca >y<-abs(y)


PROBLEME

definite ale lui x.

1. Fie vectorul x=(1,NA,2,NA). S se creeze vectorul y care conine doar elementele


#creez vectorul x #selectez valorile definite i le scriu n y #afiez y #rezultat

Soluie >x<-c(1,NA,2,NA) >y<-x[![Link](x)] >y [1] 1 2

2. Se d vectorul x=(-7,1,NA,NA,8). Creai vectorul y care conine elementele


definite ale lui x plus valoarea 5. Soluie >x<-c(-7,1,NA,NA,8) >(x+5)[(![Link](x)) & x>0] ->y >y [1] -2 13 #creez vectorul x #creez vectorul y #afiez y #rezultat

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

4. Se d vectorul numeric x=(3,11,8,15,12). Creai vectorii y1 care s conin

5. Elementele vectorilor pot fi specificate i prin iruri de caractere. De exemplu,


vectorul v=(100,200,300) poate fi scris astfel: v=(a=100,b=200,c=300). Extragei al doilea i al treilea element al lui v si scriei aceste elemente n vectorul numeric v1. Soluie >v=c(a=100,b=200,c=300) >v1=v[c(b,c)] >v1 b c 200 300 #rezultat

2.2.

Modul, lungimea i clasa obiectelor limbajului R

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

[1] "1.1" "-7.2" "1.9" "-3.4"

#rezultat

2. Transformai vectorul numeric x din problema precedent ntr-un vector care s


conin partea ntreag a elementelor lui x. Soluie >x=c(1.1, -7.2, 1.9, -3.4) >y=[Link](x) >y [1] 1 -7 1 -3 #creez vectorul x #construiesc vectorul de nr ntregi #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.

5. Creai vectorul x=(1,7,2,9) cu ajutorul funciei c(). Determinai clasa lui x cu


ajutorul funciei class(). Soluie >x<-c(1,7,2,9) >class(x) [1] numeric #creez vectorul x #determin clasa lui x #rezultat

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

1. Creai vectorul caracter nume=(Ion, Vasile, Gelu, Grigore). Ordonai


alfabetic elementele acestui vector. Soluie

> nume=c(Ion, Vasile, Gelu, Grigore) >numes=sort(nume) >numes [1] "Gelu" "Grigore" "Ion" "Vasile"

#creez vectorul nume #ordonez alfabetic #afiez pe ecran #rezulatul

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

3. Presupunem ca la un concurs sportiv particip 10 sportivi din Romnia (rom),

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

>y2=x[2,] >y1 [1] 1 2 >y2 [1] 2 4 6

#scriu prima coloana n vectorul y1 #afiey y1 #rezultat #afiey y2 #rezultat

2. Fie vectorul x ale crui componente sunt numerele ntregi de la 1 la 16 n ordine

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

#concatenez A i B pe linii #afiez C #rezultat

#concatenez A i B pe coloane #afiez D #rezultat

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

[1,] 10 1 5 [2,] 10 2 6 >C=rbind(20,A) >C [,1] [,2] [1,] 10 10 [2,] 1 5 [3,] 2 6

#se adaug o linie cu cifra 20 #afiez rezultatul #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

5. Generai matricea X de 10 linii i 10 coloane coninnd numerele de la 1 la 100

6. Utiliznd funcia matrix() generai matricele A, B i C de dou linii i trei coloane


coninnd numerele de la 1 la 6, 11 la 16 i respectiv 101 la 106. Calculai 2*A*B+C+10. Soluie >x1=seq(1,6) #creez x1 >x2=seq(11,16) #creez x2 >x3=seq(101,106) #creez x3 >A=matrix(x1,2,3) #matricea A >B=matrix(x2,2,3) #matricea B >C=matrix(x3,2,3) #matricea C >D=2*A*B+C+10 #efectuez inmultirea element cu element >D #scriu rezultatul pe ecran [,1] [,2] [,3] #rezultat [1,] 133 191 265 [2,] 160 226 308

7. Se d vectorul de date x=(1.2,-2.5,-2.5,1.2). Transformai acest vector ntr-o


matrice de dou linii i dou coloane i calculai vectorii i valorile proprii ale acestei matrice. Soluie >m=matrix(x,2,2) #creez matricea m >e=eigen(m) #calculez vectorii i valorile proprii >eva=e$val #vectorul valorilor proprii >eva #afiez valorile proprii [1] 3.7 -1.3 #rezultat >evec=e$vec #vectorul valorilor proprii

>evec [,1] [,2] [1,] -0.7071068 -0.7071068 [2,] 0.7071068 -0.7071068

#afiez vectorii proprii #rezultat

8. Calculai inversa matricei din problema precedent.


Soluie >mi=solve(m) >mi [,1] [,2] [1,] -0.2494802 -0.5197505 [2,] -0.5197505 -0.2494802 #calculez inversa lui m #afiez rezultatul #rezultat

9. S se transforme vectorul x=(1,2,3,4,5,6) ntr-o matrice de 3 linii i 2 coloane


folosind funcia matrix(). Soluie >m<-matrix(x,3,2) >m [,1] [,2] [1,] 1 4 [2,] 2 5 [3,] 3 6 #creez matricea m #afiez m

2.5. Tablouri de numere


Tablourile de numere (arrays) sunt generalizri ale matricelor la dimensiuni mai mari sau egale cu trei. De exemplu, dac vectorul x are 1500 elemente comanda >dim(x)<-c(3,5,100) genereaz un tablou tridimensional de numere de dimensiune 3 x 5 x 100 ale crui elemente sunt componentele vectorului x. Ordinea de parcurgere a elementelor unui tablou de numere este cea utilizat n FORTRAN, adic primul indice mergnd cel mai repede i ultimul cel mai ncet. De exemplu dac vectorul x cu 24 de elemente este transformat ntr-un tablou de numere, notat cu m, de dimensiune dimensiune(3,4,2) ordinea elemetelor n m este m[1,1,1]=a[1], m[2,1,1]=a[2]....m[3,4,2]=a[24]. Vectorii pot fi transformai n tablouri i cu ajutorul funciei array(). Presupunem c X este un tablou numeric pe care vrem s l construim din vectorul numeric data_vector. n acest scop vom utiliza comanda >X<-array(data_vector,dim_vector) unde dim_vector este dimensiunea tabloului. De exemplu, dac vectorul v are 24 de componente, comanda >X<-array(v,dim=c(3,4,2)) va aranja elementele vectorului v ntr-un tablou format din 3 matrice de dimensiune 4 x 2. Dac lungimea lui v este exact 24, atunci rezultatul este echivalent cu acela al comenzii >dim(X)<-c(3,4,2)

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

1. Utiliznd funcia array() generai tabloul numeric de dimensiune (3,3,2) din

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

4. Fie vectorii x=(1,2,3,4) i y=(5,6,7,8). Transformai aceti vectori n matrice de

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

#creez t1 #creez t2 #produsul element cu element #afiez rezultatul #rezultat

#produsul t2 cu t1 #este egal cu p1

6. Se d vectorul x=(1,2,3,4,5,6,7,8,9). Transformai acest vector ntr-o matrice de


dimensiune 3x3 i ntr-un tablou numeric de dimensiune 1x3x3. Calculai transpusa matricei cu funcia t() i a tabloului numeric cu aperm(). Soluie >m=matrix(x,3,3) #construiesc matricea >b=t(m) #transpusa >b #afiez pe ecran [,1] [,2] [,3] #rezultat [1,] 1 2 3 [2,] 4 5 6 [3,] 7 8 9 >t=array(x,dim=c(1,3,3)) #creez tabloul >b=aperm(t) #transpun >b #afiez pe ecran ,,1 #rezultat [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 [3,] 7 8 9

2.6.

Liste i tablouri de date

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.

1. Presupunem ca n familia Popescu soul se numete Ion, sotia Ioana. Acetia au

2. n vectorul de tip caracter nume=(Ion, Gheorghe, Costel) se afl numele a

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

Alternativ se poate vizualiza numele cu informatii$nume, greutatea cu informatii$greutate i studiile cu informatii$studii.

3. Fie vectorii de tip numeric x1=(1,7,9), x2=(8,5,12) si x3=(2,5,5). Creai un tablou de


date care s aib pe coloane aceti vectori. Denumii coloanele cu C1, C2 i C3 i liniile cu L1, L2 i L3. Soluie >x1=c(1,7,9) #vectorul x1 >x2=c(8,5,12) #vectorul x2 >x3=c(2,5,5) #vectorul x3 >m=cbind(x1,x2,x3) #matricea > colnames(m)=c("C1","C2","C3") #numele coloanelor >rownames(m)=c("L1","L2","L3") #numele liniilor >m C1 C2 C3 #rezultat L1 1 8 2 L2 7 5 5 L3 9 12 5

2.7.

Gruparea expresiilor, execuii condiionate i bucle

2.7.1. Gruparea expresiilor


Expresiile sunt combinaii de obiecte R i operatori care sunt evaluate. De exemplu y=x^2 este o expresie prin care se calculeaz ptratul lui x, iar rezultatul este stocat in y. De asemenea y = = x^2 este o expresie prin care se testeaz dac y este egal cu ptratul lui x. R este un limbaj bazat pe expresii (expression language) deoarece comenzile se execut prin intermediul expresiilor sau al funciilor, care returneaz un rezultat. Comenzile pot fi grupate prin intermediul acoladelor, {epr_1;.;expr_m}. Valoarea grupului de comenzi este rezultatul ultimei expresii din grup care este evaluat. Deoarece ntregul grup este la rndul su o expresie el poate fi, de exemplu, inclus ntre acolade i utilizat ca parte a unei expresii mai mari.

PROBLEME

1. Evaluai simultan expresiile 1.2/3.4, 2.7*5.2,-1.2+7.4 i punei rezultatul ntr-un


vector numeric. Soluie >{x1=1.2/3.4;x2=2.7*5.2;x3=-1.2+7.4} >v=c(x1,x2,x3) >v [1] 0.3529412 14.0400000 6.2000000 #grupez cele trei expresii #creez vectorul #vizualizez vectorul #rezultat

2. Fie vectorii x1=(1,7,9) si x2=(2,4,8). Evaluai simultan expresiile x1+x2 si x1-x2.


Ce rezultat obinei?

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.

2.7.2. Execuii condiionate


Funcia if() permite executarea condiionat a comenzilor n R. Apelarea acestei funcii se face cu comanda >if(cond) expr unde cond este o condiie al crui rezultat este o singur valoare logic iar expr este o expresie. Dac rezultatul evalurii condiiei este TRUE, atunci expresia este calculat. Dac rezultatul evalurii este FALSE, atunci expresia nu este calculat. Execuiile condiionate pot fi introduse i prin comanda >if(cond) expr else [Link] Dac rezultatul evalurii condiiei cond este TRUE atunci se evalueaz expresia expr iar dac rezultatul este FALSE atunci se evalueaz expresia [Link]. Operatorii && i || sunt deseori utilizai ca parte a condiiilor asociate funciei if. n timp ce operatorii & i | asociaz elemente ale vectorilor, operatorii && i || se aplic vectorilor de lungime unu i evalueaz doar al doilea argument dac este necesar. Funcia ifelse este o versiunea a funciei if/else. Forma acestei funcii este >ifelse(condition,a,b) unde a i b sunt vectori. Aceast funcie returneaz un vector de lungime egal cu maximul lungimii vectorilor a i b ale crui elemente sunt a[i] dac condiia este adevarat sau b[i] n caz contrar.

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

1. Se d vectorul numeric x=(1,2,-3). Utilizai funcia if pentru a scrie pe ecran

2. Se d vectorul x=(-1,1). Utilizai funcia ifelse pentru a determina dac un element


al vectorului x este mai mic sau mai mare sau egal cu zero. Soluie

>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

3. Se dau vectorii x=(-1,1) i y=(3,4). Creai un vector v care s conin elementele

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

2.8.1. Funcii nglobate n R


Limbajul R permite utilizatorului s creeze obiecte de tip funcie. Funciile astfel create pot fi salvate i apoi apelate ori de cte ori se dorete. Utilizarea funciilor duce la creterea spectaculoas a vitezei de calcul n R. Este recomandat ca n orice proces de calcul din R s fie utilizate, ct mai mult posibil, funciile. Trebuie notat c cele mai multe funcii sunt nglobate n sistemul R. O parte din aceste funcii, care sunt parte a sistemului R i care sunt cel mai des utilizate, sunt enumerate mai jos. all() any() TRUE args() cat() cumprod() cumsum( diff() history() [Link]() [Link]() length() ls() mean() median() #returneaz TRUE dac toate valorile unui vector logic sunt TRUE #returneaz TRUE dac cel puin o valoare a unui vector logic este #informaii despre argumentul unei funcii #printeaz obiecte multiple, unul dup altul #produs cumulativ #suma cumulativ #efectueaz diferena de ordin unu a unui vector #arat comanda precedent #returneaz TRUE dac argumentul este un factor #returneaz TRUE dac argumentul este NA #numrul de elemente al unui vector sau a unei liste #listeaz numele obiectelor din spaiul de lucru #media elementelor unui vector #mediana elementelor unui vector

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

1 7 12 NA> >cat(y) 2 NA 3 7> >cat(z) 3 NA 15 NA>

#rezultat #rezultat #rezultat

3. Se d vectorul x=(1,7,3,-10,14). Determinai indicele maximului i minimului


vectorului x. Ordonai cresctor elementele lui x i scriei-le n vectorul y. Soluie >x<-(1,7,3,-10,14) #creez vectorul x >[Link](x) #determin indicele maximului [1] 5 #rezultat >[Link](x) #determin indicele minimului [1] 4 #rezultat >y=sort(x) #aranjez cresctor >y #afiez y [1] -10 1 3 7 14 #rezultat

4. Se d vectorul x=(1,1,1,7,3,-10,14). Construii vectorul y format doar din valorile


distincte ale lui x. Obtinei informaii despre y cu ajutorul funcie str(). Soluie >x=c=(1,1,1,7,3,-10,14) #creez vectorul x >y<-unique(x) #valorile distincte ale lui x >y #afiez rezultatul [1] 1 7 3 -10 14 #rezultat >str(y) #aplic funcia str num [1:5] 1 7 3 -10 14 #rezultat (variabila numerica, 5 elemente)

5. Determinai argumentele funciei median() cu ajutorul funciei args().


Soluie >args(median) [1] function (x, [Link] = FALSE) #argumentele functiei median #rezultat

2.8.2. Funcii create de utilizator


Utilizatorul poate s defineasc propriile sale funcii. Forma general a unei funcii este >name<-function(arg_1, arg_2,...) expression unde expression este o expresie R (de obicei o grupare de expresii) care utilizeaz argumentele arg_i pentru a calcula o valoare. Valoarea expresiei este valoarea returnat de funcie. Apelarea unei funcii se face printr-o comand de forma >name(arg_1,arg_2,...) Funcia returneaz rezultatul evalurii expresiilor nglobate n corpul funcie, valori nedefinite sau mesaje de eroare. Valoarea returnat, care trebuie sa fie un singur

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

1. Se d vectorul x=(1,7,9) i y=(2,5,7). Creai funcia myadd de adunare a doi


vectori i folosii aceast funcie pentru adunarea lui x cu y. Soluie >x=c(1,7,9) #creez vectorul x >y=c(2,5,7) #creez vectorul y >myadd<-function(x,y){ x+y } #definesc funcia myadd >myadd(x,y) #adun x cu y cu funcia myadd [1] 3 12 16 #rezultat

2. Creai functia meanANDsd pentru calculul mediei si a deviaiei standard a unui

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

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