3. nodaļa. Ievads darbā ar programmu R

3.1 Kas ir programma R un kā uzsākt darbu?

3.1.1 R vide

R ir vienlaicīgi datorprogramma un valoda (veidojusies no programmēšanas valodas ‘S’), kas paredzēta datu apstrādei, aprēķiniem un grafiku veidošanai. Visi piemēri šajā grāmatā ir veidoti programmas R versijā 3.2.2. (R Core Team 2012).

R priekšrocības ir:

  • tā ir atvērtā koda programma, kas nepārtraukti tiek papildināta un uzlabota, un šajā darbā ir iesaistīti tūkstošiem cilvēku visā pasaulē}
  • R ir izmantojams uz dažādām datoru platformām: Unix, Linux, Windows, MacOS;
  • lietotājam ir dota iespēja kontrolēt visus parametrus veicot dažādus aprēķinus;
  • R ir ļoti labas grafiskās iespējas, kas ļauj veidot augstas kvalitātes grafikus.

3.1.2 R instalācija un papildus paketes

Lai instalētu programmu R, ir nepieciešams lejupielādēt Jūsu izmantotajai platformai atbilstošo R instalācijas failu no CRAN servera. Serveru adreses, kā arī citu informāciju var atrast mājas lapā http://www.R-project.org

Pirmkārt, ir jāuzinstalē pamatfails R-base. Programma R ir veidota tā, ka R-base satur tikai daļu no nepieciešamajām funkcijām, pārējās ir pieejamas papildus paketēs. Tās var uzinstalēt trīs veidos:

  • izmantojot funkciju install.packages() un norādot instalējamās paketes nosaukumu.
  • programmā R komandu rindā izvēlas Packages/Install package(s)... Tad izvēlas tuvāko serveri un paketes, kuras nepieciešams instalēt.
  • ja paketes pirms tam tika lejupielādētas datorā, tad izvēlas opciju Packages/Install package(s) from local zip files...

Ja kāda no paketēm ir nepieciešama konkrētajā darba sesijā, tad pirms lietošanas tā ir „jāpievieno” ar funkciju library(), kur iekavās norādīts nepieciešamās paketes nosaukums, piemēram:

library(grid)

3.1.3 Palīdzības iegūšana

Papildus informāciju un palīdzību darbam ar R var iegūt no dažādām pamācībām, kas brīvi pieejamas internetā. Par programmu R ir arī ļoti daudz grāmatu, no kurām nopietnākais darbs ir Crawley (2007). Ir pieejama arī R iekšējā palīdzībā. Ja nepieciešams iegūt palīdzību par kādu konkrētu funkciju, vieglākais veids ir izmantot help() funkciju, kurai iekavās norādīts otras funkcijas nosaukums, piemēram:

help(plot)

Otrs variants ir rakstīt ? zīmi pirms funkcijas nosaukuma. Jāņem vērā, ka šādā veidā ir iespējams meklēt palīdzību tikai par tām funkcijām, kuras atrodas konkrētajai darba sesijai pievienotajās paketēs. Ja nepieciešams meklēt funkciju visās instalētajās paketēs, tad jāizmanto divas ? zīmes.

??plot

3.2 Darbs ar R

3.2.1 Komandu veidošana

R vidē visas komandas tiek rakstītas pēc > zīmes (tā nav pašam jāraksta). Ja komandu rinda ir pārāk gara, tad pēc jebkura argumeta, vai arī pēc iekavām, komata, utt var spiest Enter taustiņu un turpināt pierakstu jaunā rindā. Šajā gadījumā automātiski parādīsies + zīme. Ja komanda tiek uzrakstīta pilnībā un nospiests Enter, šī komanda tiek izpildīta. Ja komanda neizpildās, bet parādās + zīme, tas nozīmē, ka komandas pierakstā ir kļūda un trūkst, piemēram, kādas iekavas.

Komandu rindas galā var pievienot arī komentāru, pirms komentāra ir jāraksta # zīme.

R vidē atstarpes starp dažādiem objektiem, iekavām tiek ignorētas, izņēmums ir kombinācija <-, ar kuru objektiem piešķir noteiktu vērtību.

Rakstot komandas ir būtiski ievērot lielo un mazo burtu izvietojumu, jo šajā gadījumā apzīmējums AA nebūs tas pats, kas aa.

3.2.2 Kalkulators

Programmu R savā veidā var izmantot kā kalkulatoru, ar kura palīdzību ir iespējams veikt dažādus aprēķinus.

4+7
## [1] 11
log(8,2)
## [1] 3
exp(2)
## [1] 7.389056

3.2.3 Datu veidi

R vidē pārsvarā lieto trīs veidu datus: skaitliskos (numeric), rakstu zīmes (character) un loģiskos (logical).

Skaitliskie dati ir skaitļi, un tikai šāda veida objektus var izmantot, lai veiktu aprēķinus.

Rakstu zīmju datus parasti izmanto, lai norādītu mainīgajiem nosaukumus, kā arī, lai veiktu datu grupēšanu.

Loģiskajiem datiem var būt divas vērtības TRUE vai FALSE (jeb T un F).

3.2.4 Datu struktūras

Četras galvenās datu struktūras R vidē: vektors (vector), matrice (matrix), saraksts (list) un datu tabula (data frame).

3.2.4.1 Vektors

Vektors ir viendimensionāla datu struktūra, kas var sastāvēt tikai no viena tipa datiem –- skaitļiem vai rakstu zīmēm. Vektora garums nav ierobežots – tas var būt tikai vienu zīmi liels, vai arī sastāv no ļoti daudz zīmēm vai skaitļiem.

Lai nodefinētu vektoru, kas sastāv tikai no vairāk kā viena mainīgā, jāraksta vēlamais objekta (vektora) nosaukums un aiz apzīmējuma <- jāraksta funkcija c(), kurai iekavās norāda mainīgos:

Rezultātā izveidotais objekts tiek saglabāts R atmiņā. Lai apskatītu izveidoto objektu, ir jāuzraksta tā nosaukums un jānospiež Enter.

pirmais<-c(1,5,7,4,8,10)
pirmais
## [1]  1  5  7  4  8 10
otrais<-c("A","B","C","D","E","F")
otrais
## [1] "A" "B" "C" "D" "E" "F"

3.2.4.2 Matrice

Matrice ir divdimensionāla datu struktūra, kas līdzīgi vektoram var saturēt tikai viena tipa datus. Matrici var izveidot izmantojot trīs funkcijas: cbind(), rbind() vai matrix().

Funkcijā matrix() norāda visus matricē iekļaujamos elementus, kā arī norāda rindu skaitu (nrow) vai arī kolonnu skaitu (ncol); abus nevajag norādīt, jo, ja ir norādīts, piemēram, kolonnu skaits, tad rindu skaits tiks aprēķināts automātiski, ņemot vērā elementu skaitu matricē:

tresais<-matrix(1:15,ncol=3)
tresais
##      [,1] [,2] [,3]
## [1,]    1    6   11
## [2,]    2    7   12
## [3,]    3    8   13
## [4,]    4    9   14
## [5,]    5   10   15

Funkciju cbind() izmanto, lai izveidotu matrici, tās elementus secīgi rakstot kolonnās (iekavās aiz funkcijas jānorāda elementi, kas atradīsies katrā no kolonnām), attiecīgi funkciju rbind() izmanto matrices veidošanai pa rindiņām.

ceturtais<-cbind(pirmais,otrais)
ceturtais
##      pirmais otrais
## [1,] "1"     "A"   
## [2,] "5"     "B"   
## [3,] "7"     "C"   
## [4,] "4"     "D"   
## [5,] "8"     "E"   
## [6,] "10"    "F"
\subsubsection{Saraksts}

Saraksts ir datu struktūras, kas var saturēt jebkuru citu datu struktūru, tai skaitā arī apakšsarakstus. Saraksts ir ļoti ērts, lai vienā objektā apvienu dimensionāli atšķirīgus elementus, piemēram, no vienas analīzes rezultātiem. Sarakstu veido ar funkciju list().

piektais<-list(vekt1=pirmais,matr1=tresais,matr2=ceturtais)
piektais
## $vekt1
## [1]  1  5  7  4  8 10
## 
## $matr1
##      [,1] [,2] [,3]
## [1,]    1    6   11
## [2,]    2    7   12
## [3,]    3    8   13
## [4,]    4    9   14
## [5,]    5   10   15
## 
## $matr2
##      pirmais otrais
## [1,] "1"     "A"   
## [2,] "5"     "B"   
## [3,] "7"     "C"   
## [4,] "4"     "D"   
## [5,] "8"     "E"   
## [6,] "10"    "F"

3.2.4.3 Datu tabula

Datu tabula ir divdimensionāla datu struktūra, kas var saturēt dažāda tipa datus atsevišķās kolonnās (visām kolonnām vienā datu tabulā ir jābūt ar vienādu garumu). Datu tabulu izveido ar funkciju data.frame(). Funkcijas iekavās norāda kolonnu nosaukumus, kā arī datus, kas būs katrā no kolonnām. Dati var būt kā atsevišķi vektori, kas izveidoti jau iepriekš, vai arī datus var ierakstīt pašā funkcijā:

sestais<-data.frame(pirmais,otrais)
sestais
##   pirmais otrais
## 1       1      A
## 2       5      B
## 3       7      C
## 4       4      D
## 5       8      E
## 6      10      F
septitais<-data.frame(kol1=c(1,2,3,4),kol2=c(5,6,7,8))
septitais
##   kol1 kol2
## 1    1    5
## 2    2    6
## 3    3    7
## 4    4    8

Vēl datu tabulu var izveidot izmantojot datu tabulu veidotāju pašā programmā R. Šajā gadījumā no sākuma ar kādu Jums vēlamu nosaukumu ir jāizveido datu tabula ar funkciju data.frame(), kurai netiek norādīti nekādi papildus argumenti. Pēc tam jāizmanto funkcija fix(), kurai kā arguments jānorāda jaunās datu tabulas nosaukums. Rezultātā parādīsies datu tabulu veidošanas logs, kurā var ievadīt datus. Lai mainītu kolonnu nosaukumus, ir jāuzklikšķina uz tā - šajā brīdī ir iespējams arī norādīt vai dati būs skaitliski vai rakstu zīmes. Ir jāatceras, ka vienā kolonnā var atrasties tikai viena veida dati, kā arī, ka visu kolonnu garumiem ir jābūt vienādiem.

jauna.tabula<-data.frame()
fix(jauna.tabula)

Ar funkcijas fix() palīdzību ir iespējams labot arī citas jau esošās tabulas.

3.2.5 Datu importēšana

R vidē ir iespējams importēt dažāda formāta datu failus (datu tabulas), piemēram, no programmām Excell, SPSS, SAS. Vienkāršākais veids ir izmantot .txt vai .csv failus.

3.2.5.1 Teksta failu importēšana

Lai importētu .txt failus, tiek izmantota funkcija read.table(), attiecīgi .csv failus var importēt ar funkcijām read.csv() un read.csv2(). Funkcijā norāda faila nosaukumu un ceļu uz to (file=). Ja pirmā tabulas rinda satur kolonnu nosaukumus, tad kā papildus arguments jānorāda header=TRUE. Vēl jānorāda skaitļu decimāldaļu atdalītājs (komats vai punkts), izmantojot papildus argumentu dec=".". Tā kā .txt failiem mēdz būt dažādi kolonnu atdalīšanas veidi, tad jānorāda atbilstošais, izmantojot papildus argumentu sep=, iespējamās vērtības ir "\t" - tab delimited; ","- kolonnu atdalītājs ir komats; ";" - kolonnu atdalītājs ir semikols. Pilno ceļu uz importējamo failu var nenorādīt, ja fails atrodas darba direktorijā (Working directory) (var nomainīt ar funkciju setwd().

dati<-read.table(file="niedres.txt",header=TRUE,sep="\t",dec=".")
dati2<-read.csv(file="niedres.txt",header=TRUE,sep="\t",dec=".")
dati3<-read.csv2(file="niedres.txt",header=TRUE,sep="\t",dec=".")
dati[1:10,]
##    garums platums
## 1    31.6     2.5
## 2    23.2     2.3
## 3    39.2     2.1
## 4    37.4     5.8
## 5    21.1     2.2
## 6    37.0     4.1
## 7    24.7     3.5
## 8    31.3     4.2
## 9    37.4     2.5
## 10   39.7     2.8

3.2.5.2 Excel failu importēšana

Excel failu importēšanai programmā R ir jāizmanto papildus paketes, jo ar bāzes R funkcijām to nav iespējams izdarīt. Viens no variantiem ir izmantot paketi readxl (Wickham 2016).

Šajā paketē ir tikai divas funkcijas – excel_sheets() un read_excel(). Ar pirmo funkciju ir iespējams noskaidrot kādi ir lapu nosaukumi Excel failā, kuru vēlamies importēt. Otrā funkcija ir paša faila importēšanai.

Pēc noklusējuma read_excel() importēs pirmo lapu no faila, bet to var izmainīt ar argumentu sheet = un norādīt, kuru lapu (pēc skaita vai pēc nosaukuma) importēt. Nākamais pieņēmums ir, ka Jūsu failā pirmā rinda satur kolonnu nosaukumus – ja tas tā nav, tad jāizmanto arguments col_names =. Šī funkcija visnotaļ veiksmīgi māk pati “saprast” kāda veida dati ir katrā no kolonnām, bet, ja tas neizdodas automātiski, tad jāizmanto argumentu col_types = un jānorāda katras kolonnas veids (“blank”, “numeric”, “date” vai “text”).

library(readxl)
dati.ex <- read_excel("faila.nosaukums.xlsx")

3.2.5.3 Iekļauto datu importēšana

Pašā programmā R ir iekļautas daudzas datu tabulas, kas ir ļoti noderīgas, piemēram, lai izmēģinātu kādas funkcijas, vai arī sekotu līdzi piemēriem mācību materiāliem.

Lai redzētu, kuras datu tabulas ir pieejamas konkrētajā darba sesijā (atkarīgs no pievienoto pakešu daudzuma), jāizmanto funkcija data(), pēc kā parādīsies jauns logs, kurā uzskaitītas pieejamās datu tabulas un to apraksts. Lai redzētu visas pieejamās datu tabulas, jāraksta data(package = .packages(all.available = TRUE)).

data()
data(package = .packages(all.available = TRUE))

Lai pievienotu darba sesijai kādu no šīm datu tabulām, jāizmanto funkcija data(), kurai iekavās norādīts datu tabulas nosaukums. Ja pakete, kurā atrodas šī datu tabula jau ir pievienota darba sesijai, tad papildus argumenti nav vajadzīgi, bet ja pakete nav pievienota, tad funkcijai ir jāliek klāt papildus arguments package=}. Pēc tam datu tabula ir pievienota darba sesijai ar tādu nosaukumu, kāds ir pašai datu tabulai.

data(cars)
data(cars, package = "datasets")
cars[1:10,]
##    speed dist
## 1      4    2
## 2      4   10
## 3      7    4
## 4      7   22
## 5      8   16
## 6      9   10
## 7     10   18
## 8     10   26
## 9     10   34
## 10    11   17

3.2.6 Datu eksportēšana

Datu eksportēšanu veic ar funkciju write.table(), kurā jānorāda objekts, kuru vēlas eksportēt (x=), izveidojamā faila nosaukums un saite uzto (file=), kolonnu atdalītājs (sep=), decimālatdalītājs (dec=) un vai rindu nosaukumus iekļaut (row.names=TRUE vai FALSE).

write.table(x=dati,file="eksports.txt",row.names=FALSE,sep="\t",dec=".")

3.2.7 Darbs ar datiem

Ar funkcijas str() palīdzību ir iespējams apskatīt jebkura datu objekta struktūru, tajā ejošos datus un to veidu. Rezultāts ir atkarīgs no tā, kāda veida datu objekts tiek apskatīts.

str(dati)
## 'data.frame':    50 obs. of  2 variables:
##  $ garums : num  31.6 23.2 39.2 37.4 21.1 37 24.7 31.3 37.4 39.7 ...
##  $ platums: num  2.5 2.3 2.1 5.8 2.2 4.1 3.5 4.2 2.5 2.8 ...
str(sestais)
## 'data.frame':    6 obs. of  2 variables:
##  $ pirmais: num  1 5 7 4 8 10
##  $ otrais : Factor w/ 6 levels "A","B","C","D",..: 1 2 3 4 5 6
str(piektais)
## List of 3
##  $ vekt1: num [1:6] 1 5 7 4 8 10
##  $ matr1: int [1:5, 1:3] 1 2 3 4 5 6 7 8 9 10 ...
##  $ matr2: chr [1:6, 1:2] "1" "5" "7" "4" ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : NULL
##   .. ..$ : chr [1:2] "pirmais" "otrais"
str(tresais)
##  int [1:5, 1:3] 1 2 3 4 5 6 7 8 9 10 ...
str(otrais)
##  chr [1:6] "A" "B" "C" "D" "E" "F"

Datu tabulu un matricu apskatīšanai noderīgas ir funkcijas head() un tail(), kas attiecīgi parāda datu objekta pirmās sešas un pēdējās sešas rindiņas. Rindiņu skaitu ir iespējams mainīt, norādot papildus argumentu n=.

head(dati)
##   garums platums
## 1   31.6     2.5
## 2   23.2     2.3
## 3   39.2     2.1
## 4   37.4     5.8
## 5   21.1     2.2
## 6   37.0     4.1
tail(dati)
##    garums platums
## 45   46.1     5.3
## 46   29.1     3.5
## 47   33.7     4.6
## 48   43.1     3.7
## 49   38.8     3.9
## 50   46.9     5.4

3.2.7.1 Daļas no objekta atlasīšana

Ja ir nepieciešams atlasīt tikai daļu no objekta, veids kā to darīt ir atkarīgs no objekta veida. Tā kā vektors ir viendimensionāla datu struktūra, tad vien elementa atlsīšanai aiz objekta nosaukuma ir jāliek kvadrtātiskās iekavas, kurās jānorāda atlasāma elementa kārta numurs.

otrais[1]
## [1] "A"

Vairāku vektora elementu alasīšanai kvadrātiskajās iekavās jāizmanto funkcija c(), kurā norāda atlasāmo elemntu kārtas numurus.

otrais[c(1,4)]
## [1] "A" "D"

Ja ir nepieciešams atlasīt visus elementu, izņemot kādu konkrētu elementu, tad ‘’nevēlamā’’ elementa kārtas numuru kvadrātiskajās iekavās norāda ar mīnus zīmi.

otrais[-3]
## [1] "A" "B" "D" "E" "F"

No matrices, kas ir divdimensionāla datu struktūra, konkrētu elementu var atlasīt kvadrātiskajās iekavās norādot divus skaitļus, kur pirmais nozīmē rindiņas numuru, bet otrais nozīmē kolonnas numuru.

tresais[2,2]
## [1] 7

Ja kvadrātiskajās iekavās norāda tikai vienu skaitli, bet otra vietu atstāj tukšu, tad attiecīgi tiek atlasīta visa rindiņa, vai arī visa kolonna.

tresais[1,]
## [1]  1  6 11
tresais[,2]
## [1]  6  7  8  9 10

Elementus no saraksta var atlasīt vairākos veidos, piemēram, rakstot objekta nosaukumu, tad $ zīmi un saraksta elementa nosaukumu. Otrs variants ir izmantot dubultās kvadrātiskās iekavas un norādīt saraksta elementa kārtas numuru.

piektais$vekt1
## [1]  1  5  7  4  8 10
piektais[[2]]
##      [,1] [,2] [,3]
## [1,]    1    6   11
## [2,]    2    7   12
## [3,]    3    8   13
## [4,]    4    9   14
## [5,]    5   10   15

Ar iepriekšējām divām metodēm no saraksta ir iespējams atlasīt tikai visu elementu. Ja ir nepieciešams atlasīt kaut ko no paša saraksta elementa, tad jāizmanto otras kvadrātiskās iekavas.

piektais[[2]][1,]
## [1]  1  6 11

No datu tabulas visu kolonnu var atlasīt tās nosaukumu norādot ar $ zīmes vai arī pēdiņās ierakstot kvadrātiskajās iekavās.

sestais$pirmais
## [1]  1  5  7  4  8 10
sestais["pirmais"]
##   pirmais
## 1       1
## 2       5
## 3       7
## 4       4
## 5       8
## 6      10

Viena elementa atlasīšanai ir jāizmanto tāds pats pieraksts kā matricai - kvadrātiskajās iekavās jānorāda divi skaitļis, kas apzīmē rindiņas un kolonnas numuru.

sestais[5,1]
## [1] 8

Viena no programmas R specifikām ir tā, ka datu tabulām esošos kolonnu nosaukumus nav iespējams uzreiz izmantot kā mainīgos. Piemēram, ja uzrakstīsim mainīgo garums, kas atrodas pievienotājā datu tabulā dati, parādīsies paziņojums, ka tāda mainīgā nav. R ,veidojot datus tabulas un importējot failus ,katru no kolonnām neuztver kā atsevišķu objektu.

garums

3.2.8 Darba vides sakārtošana

Ja darba sesijā rada dažādus objektus, pievieno daudz paketes, ar laiku var rasties apjukums par to, kādi objekti šobrīd ir aktīvi. Ar funkcijas ls() palīdzību, ir iespējams iegūt sarakstu ar visiem objektiem, kas šobrīd ir aktīvi:

ls()
##  [1] "akor"       "apaksa"     "atlikums"   "augi"       "augi2"     
##  [6] "augsa"      "cars"       "ceturtais"  "dat"        "dati"      
## [11] "dati2"      "dati3"      "dieta"      "i"          "jauns"     
## [16] "koki"       "kopa"       "mod"        "mod1"       "mod2"      
## [21] "mod3"       "mod4"       "nezales"    "niedr"      "niedr2"    
## [26] "niedres"    "otrais"     "par1"       "par2"       "paraug"    
## [31] "piektais"   "pirmais"    "pred.esana" "pred.kopa"  "priede"    
## [36] "progn"      "robeza"     "rokas"      "septitais"  "sestais"   
## [41] "smiltaji"   "starpibas"  "teor.zirni" "tests"      "tresais"   
## [46] "veids1"     "veids2"     "veids3"     "vid.rob"    "vid.st"    
## [51] "vid1"       "vid2"       "videjie"    "x"          "zirni"

Lai kādu no šiem objektiem noņemtu no darba sesijas, jāizmanto funkcija , kurai kā arguments jānorāda objekts, kuru vēlaties noņemt no darba sesijas. Šī metode gan attiecas tikai uz tiem objektiem, kurus esat radījuši paši, nevis uz datu tabulām, kas atrodas paketēs.

rm(pirmais)