rolisz's site

Scurtă introducere în R

R este un limbaj de programare făcut în primul rând pentru a face calcule statistice și pentru a vizualiza acestea. Are aproape 20 de ani (1993) și este cel mai folosit limbaj pentru data mining.[1. Rexer Analytics] Este desigur cross-platform, merge nativ și pe Windows, Linux, Mac OS X.

El vine gata integrat cu "IDE", deși acesta e cam nașpa (no au­to­com­plete, no keyboard text selection, etc.). Există și al­ter­na­tive cum ar fi RStudio sau RKWard. Pentru scopul acestui tutorial, îi cam totuna ce folosiți, limbajul contează.

Operații se pot introduce în linia de comandă și rezultatul este afișat imediat:

> 10 + 2*5
[1] 20
> sqrt(49) + log(10)
[1] 9.302585

Operatorul de atribuire este... <-. Îi un pic ciudat la început și ia un pic de timp până nu mai scrii = din obișnuință. Totul în R este un obiect, inclusiv funcțiile, așa că atenție la ce nume atribuiți vari­abilelor. c este funcție implicită folosită pentru combine vector. Numerele normale sunt tratate... normal, știe și de numere complexe (și unitatea imaginară este i, nu j ca în Python :D), știe și șiruri de caractere și tipuri logice.

> x  x
[1] 1.14473
> y  y
[1] 10 - 5i
> Re(y)
[1] 10
> Im(y)
[1] -5
> char  char
[1] "abcde"
> x < 2 [1] TRUE > x == 3
[1] FALSE

Adevărata putere a limbajului începe să se manifeste când apar vectorii și matricile:

> x <- c(1,2,3)  #c este funcția de concatenare
> x
[1] 1 2 3
> y <- 10:20     # se pot crea rangeuri de numere consecutive
> y
 [1] 10 11 12 13 14 15 16 17 18 19 20
> y + 2          # operațiile aritmetice cu scalari se aplică automat la
                    # fiecare membru al vectorului
 [1] 12 13 14 15 16 17 18 19 20 21 22
> 2*y
 [1] 20 22 24 26 28 30 32 34 36 38 40
> x^2
[1] 1 4 9
> 2^x
[1] 2 4 8
> y <- 6:8
> y
[1] 6 7 8
> x+y            # adunarea de vectori
[1]  7  9 11
> x*y            # inmultirea in acest caz se face membru cu membru
[1]  6 14 24
> x %*% y        # aceasta este înmulțirea matriceală, care rezultă într-o
                    # matrice de 1x1
     [,1]
[1,]   44
> sum(x)         # suma tuturor membrilor
[1] 6
> cumsum(y)      # un vector cu suma membrilor de până la acea poziție
[1]  6 13 21
> diff(x)        # vector cu diferențele dintre membri
[1] 1 1
> diff(x,2)      # diferența a doua (diferența vectorului diferență)
[1] 2
> x <- 1:5
> x
[1] 1 2 3 4 5
> diff(x,1,lag=2)# diferența cu pasul 2 (se iau tot membrul al doilea)
[1] 2 2 2
> diff(x,3)
[1] 3 3
> diff(x,4)
[1] 4
> x <- c(1,1,2)
> diff(x)
[1] 0 1
> max(y)
[1] 8
> min(y)
[1] 6
> sort(y,decreasing=T)
[1] 8 7 6
> length(y)      # lungimea vectorului
[1] 3
> x[2]           # accesarea elementelor din vector
[1] 1
> x[0]           # atenție, la poziția 0 se află detalii despre vector
numeric(0)
> x[2:3]         # se pot selecta și rangeuri din vector
[1] 1 2
> x[-2]          # toate elementele mai puțin al doilea
[1] 1 2
> x[x>1]      # toate elementele mai mari decât 1
[1] 2
> x[x<2]
[1] 1 1
> x>3         # un vector conținânt valoarea de adevăr pentru fiecare membru
[1] FALSE FALSE FALSE
> x<2
[1]  TRUE  TRUE FALSE
> sum(x<2)    # suma membrilor mai mici decât 2
[1] 2
> (1:length(y))[y<=7]  # indicii membrilor mai mici sau egali cu 7
[1] 1 2
> z <- as.logical(c(1,0,-1,2))  # logical cast
> z
[1]  TRUE FALSE  TRUE  TRUE

Now some matrix fun:

> x <- c(1,2,3)
> y <- c(4,5,6)
> m1 <-cbind(x,y)         # column bind
> m1
     x y
[1,] 1 4
[2,] 2 5
[3,] 3 6
> t(m1)                   # transpusa matricii
  [,1] [,2] [,3]
x    1    2    3
y    4    5    6
> dim(m1)                 # dimensiunea: 3 coloane și 2 rânduri
[1] 3 2
> m1 <- rbind(x,y)        # rowbind, echivalent cu t(cbind(x,y))
> m1
  [,1] [,2] [,3]
x    1    2    3
y    4    5    6
> m2 <- matrix(c(1,2,3,4,5,6,7,8,9,10),nrow=5)
> m2                     # matricea este specificată direct prin elemente și numărul de
                            #  rânduri, elementele fiind puse pe coloane mai întâi
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10
> m3 <- matrix(c(1,2,3,4,5,6,7,8,9,10),nrow=5,byrow=T)
> m3                     # elementele sunt puse pe rânduri mai întâi
     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6
[4,]    7    8
[5,]    9   10
> m2[3,2]               # elementul din linia 3, coloana 2
[1] 8
> m2[2]                 # elementul al doilea, numărând pe linie
[1] 2
> m3[8]
[1] 6
> m2[2,]                # linia a doua
[1] 2 7
> m2[,2]                # coloana a doua
[1]  6  7  8  9 10
> m2 <- matrix(c(1,2,3,4,5,6,7,8,10),nrow=3) > solve(m2) # inversa matricii
           [,1]       [,2] [,3]
[1,] -0.6666667 -0.6666667    1
[2,] -1.3333333  3.6666667   -2
[3,]  1.0000000 -2.0000000    1

Operațiile pe matrici se fac la fel ca la vectori, pe componente, mai puțin %*%, care este înmulțirea matricilor.

Ultima chestie pe care o mai prezint este un tip de date specific R: NA. Acesta vine de la Not Applicable și semnifică lipsa unei date. Există câteva reguli speciale când lucrăm cu el:

> x <- NA > y <- 2 > x+y
[1] NA
> x*y
[1] NA
> x x == NA
[1] NA
> mean(c(x,y))
[1] NA

După cum vedeți, ma­jori­tatea op­er­ați­ilor în combinație cu NA returnează tot NA, inclusiv testarea de egalitate cu NA. Cum putem să detectăm atunci prezența lui NA? Cu funcția is.na(x). Aceasta returnează TRUE dacă x este NA și FALSE dacă nu. Această funcție poate fi folosită și pentru a filtra valori NA din matrice.

> x <- c(1,2,3,4,NA) # vector cu NA  > x
[1]  1  2  3  4 NA
> x[x<4]             # NA rămâne și după comparații [1]  1  2  3 NA > x[x>5]
[1] NA
> mean(x)            # nu putem calcula media
[1] NA
> x[x>2 & !is.na(x)]
[1] 3 4
> mean(x[!is.na(x)])
[1]2.5

Stay tuned for next ...'s episode când o să prezint cum am făcut sta­tis­ti­cile pentru examene.