Ugrás a fő tartalomra

R programozás alapok 1

R nyelv

Az R egy magas szintű programozási nyelv és környezet, melynek legfontosabb felhasználása az adatelemzés és az ahhoz kapcsolódó grafikus megjelenítés.  Az R nyelv egy interpretált szkript nyelv.

Az R programozási nyelv többek között regressziós, klasszifikációs döntés, ... modellek illesztésére, trendelemzésre, hipotézisvizsgálatra és többváltozós statisztikai vizsgálatokra, így faktor- és klaszteranalízisre és egyéb tudományos számítás  elvégzésére használható. 

Az R rendelkezik grafikus megjelenítő eszközzel, ezáltal eredményeinket számos diagramtípus közül választva ábrázolhatjuk. Az R az évek folyamán nemcsak statisztikai, hanem más vizsgálatokra is alkalmassá vált, például gyökkeresési algoritmusok is elérhetők numerikus integráláshoz. 

 Én most a Windows alatt telepített R működősével foglalkozom. A telepítését követően az R-t az RGui.exe állománnyal indíthatjuk 

"C:\Program Files\Microsoft\R Client\R_SERVER\bin\x64\rgui.exe"

















Az R-ben a kódok kétféleképpen értelmezhetők: parancssori és script módban. Előbbi esetben az R grafikus felhasználói felületének (graphical user interface, GUI) terminál ablakába (R Console) írjuk be a parancsokat és hajtatjuk végre azokat. Utóbbi esetben a script fájlban kerül tárolásra, amely a terminál ablakban hívható meg


 R-ben beépített függvények állnak rendelkezésre a számítások végrehajtására, azonban számos kiegészítő csomag (package) is letölthető, amelyek különböző függvényeket tartalmaznak.

A függvények szintaxisa: függvénynév(paraméter). Például tartalom képernyőre való kiíratása a print függvénnyel történhet, amelynek gömbölyű zárójelekkel határolt argumentumába írhatjuk a megjelenítendő szöveget.
print("Hello, World!")


- Az R-ben a sorok a  > prompt karakterrel kezdődnek. Be nem fejezett utasításokra sortörést alkalmazva az új sor + jellel kezdődik > helyett.

- A szintaktikailag teljes utasítások sortöréssel végződnek.

- Az utasítás bevitele az Esc billentyűvel szakítható meg.

- Az R kis- és nagybetű érzékeny, így létrehozhatunk különböző értékű, a és A elnevezésű objektumot.

- A megnyitandó állományok nevében, elérési útjában található ékezetek, szóközök általában nem okoznak problémát, de ezek használata inkább kerülendő.

- Az R-ben a tizedesjel alapértelmezetten pont, nem vessző. (Állomány beolvasásakor ez átállítható, például a read.table függvény használata esetén.)

- A Console felület a Ctrl+l utasítással törölhető.

- A script több sora elé kettőskeresztet a sorok kijelölése után a Ctrl+Shift+c betűkombinációval tehetünk.

-  R lezárására használható q() vagy quit() függvény.

- Az utasításainkhoz fűzött magyarázatainkat egy vagy több kettőskereszt (#) karakterrel vezetjük be.


RStudio

Az R programozás megkönnyítésére külön GUI is létezik, program maga az RStudio honlapjáról tölthető le (de ez feltételezi, hogy az R már telepítve van).




A RStudio müködésekor munkafolyamat során létrehozott objektumok törlődnek, ha a munkaterületet nem mentjük.

Objektumainkat bináris, RData kiterjesztésű állományba menthetjük a munkavégzés mappájába a save.image("név.Rdata") utasítással.

Beolvasása a load("név.Rdata") utasítással lehetséges. A létrehozott fájl hordozható, vagyis másik gépen szintén megnyitható, ha rendelkezésünkre áll az R.

A Console ablakban a munkafolyamat alatt kiadott utasítások lapozhatók a felfelé és lefelé mutató nyilakkal. A visszahívott parancsok szerkeszthetők is, a sorokban a balra és jobbra mutató nyilakkal pozícionálhatjuk a kurzort. A teljes parancs végrehajtása ENTER-rel történhet, ehhez nem szükséges a sor végére navigálni.





Előző parancssor újbóli előhívása felfelé mutató nyíl gombbal lehetséges.

A parancs név kiegészítése TAB billentyűvel kérhető ekkor rövid segítő leírás is megjelenik.





Az utasítások Rhistory kiterjesztésű szöveges állományban menthetők a savehistory("név.Rhistory") paranccsal.

Betöltése a loadhistory("név.Rhistory") paranccsal történhet.

Kerülendő, hogy a létrehozott objektumainkat a munkavégzés alapértelmezett mappájában található .RData elnevezésű állományba mentsük, ugyanis a RStudio újbóli elindításakor ezek automatikusan betöltésre kerülnek, függetlenül attól, hogy szükségünk van ezekre az új munkafolyamat során vagy sem.




Az RStudio felülete (alapértelmezetten négy részre osztott):




1.  A bal alsó, Console ablakban az ENTER-rel jóváhagyott kódok egyesével kerülnek értelmezésre és végrehajtásra az R parancsértelmezője által. Az eredmény szintén ebben az ablakban jelenik meg

2. A bal felső, Script ablakba írnunk utasítások sorozatokat és scriptként mentenünk, hiszen így később is fel tudjuk használni. Az R script bármilyen szövegszerkesztővel írható, amelyből a vágólapra másolhatók az utasítások és beilleszthetők az R script ablakba.
    Új script a File/New File/Script menüpontban hozható létre. Mentésére a File/Save menüpontban kerülhet sor. (A mentéskor célszerű UTF-8 kódolást használni.)
 
 3. A jobb felső ablakának Environment fülén láthatók a létrehozott objektumok
    Az objektumok törlése az rm függvénnyel lehetséges, argumentumában felsorolva a törlendő objektumokat, vesszővel elválasztva. Az összes létrehozott objektum az rm(list=ls()) paranccsal törölhető. (A törlést tehát két függvény egymásba ágyazásával értük el. A list=ls() paranccsal arra utasítottuk az R-t, hogy az objektumok neveit fűzze össze egy karakterlánc típusú vektorba, majd a törlést az rm függvénnyel hajtottuk végre.)

4. A jobb alsó ablakrésznél a bemeneti és kimeneti erőforrások láthatók a tab fülekre csoportosítva.





R alap utasítások:





Az R-ben létrehozott objektumok lehetnek  
  egyeleműek
       numerikus (numeric),
       szöveg (character)
       vagy logikai (logical)
 vektorértékűek
    mátrixok (matrix),
    tömbök (array),
    adatstruktúrák (data frame),
   listák.

Utóbbiak abban különböznek a mátrixoktól és a tömböktől, hogy oszlopaikban eltérő típusú adatok (pl. számok, dátumok és szövegek) is szerepelhetnek.

Számos speciális típusú objektum létezik. Ilyen például a ncdf4 típusú objektum, amely NetCDF fájlokban tárolt többdimenziós tömbök meta adatait tartalmazhatja.




Értékadás nélkül az R megjeleníti egy művelet eredményét, de nem tárolja el azt.

Alapvető matematikai műveletek: 
     Két szám összege: x+y
     Két szám különbsége: x-y
     Két szám szorzata: x*y
     Két szám hányadosa: x/y

Hatványozás: 
     Ha x a hatvány alapja és y a kitevője, akkor: x**y vagy x^y

A műveletek () zárójelekkel csoportosíthatók, így a műveleti sorrend megváltoztatható.


A műveleti parancs utáni sorban jelenik meg az eredmény.

A szögletes zárójelekben található [1] szám arra utal, hogy az eredmény sorvektor (ebben az esetben egy komponensű vektor, azaz skalár).



Az eredmény eltárolásához objektumba kell azt mentenünk. 

Értékadás az alábbi módokon lehetséges:
    objektumnév <- kifejezés
    kifejezés -> objektumnév
    objektumnév = kifejezés

 Egymás után több, azonos nevű objektumot létrehozva, az utóbbi felülírja az előbbit.

Mivel az R kis- és nagybetű érzékeny, ugyanaz a név kis- és nagybetűvel írva különböző objektumokat fog jelölni.

Az objektumok, változók nevében szerepelhet pont, alulvonás és különleges karakter is, utóbbiak használata azonban kerülendő.

Ha a név ponttal kezdődik, akkor a második karakter nem lehet szám.

Névként nem használhatók az alábbi „foglalt” kifejezések, noha egy objektumnév részeként alkalmazhatók:
TRUE, FALSE, NULL, Inf, NaN, NA, NA_integer_, NA_real_, NA_complex_, NA_character_.

A kis- és nagybetű érzékenység miatt kizárólag a teljes egyezés kerülendő az előbb felsorolt szavakkal.



Utasítások blokkok:
Több utasítás megadása esetén az utasítások blokkokba szervezhetők, kapcsos zárójelek használatával.
{x <- 1+2
 y <- 2*5
 z <- x/y
 }
 z
 [1] 0.3

A { után a > prompt jel + jelre változik. Az utasítások blokkját } fejezi be.
Az utasítások tehát ezt követően hajtódnak végre.

Utasítások blokkokba szervezésére ciklusok esetén lehet szükségünk.


Az objektumok típusának, dimenziójának meghatározása: 
Az objektumok típusa és dimenziója (kettő vagy annál több dimenziós objektum esetén) például a class és dim függvényekkel jeleníthető meg.

Szintaxisuk: class(objektumnév) dim(objektumnév)


A maradékos osztás a %% operátorral, az egész osztás a %/% operátorral végezhető el.

Például :
       9%%2 azt adja meg, hogyha kilencet osztjuk kettővel, akkor mennyi lesz a maradék,
míg 9%/%2 azt adja meg, hogy hány egész számszor van meg kilencben a kettő.



Vektorok 
A vektort egymás melletti cellákban tárolt értékek sorozataként képzelhetjük el, mely értékek mindegyike azonos típusú.
Több érték vagy azonos típusú objektum „összefűzésére” (konkatenációjára)  a c függvény használható, amelynek szintaxisa: c(érték1, érték2, érték3,...)
A függvénnyel számokból például numerikus vektorok készíthetők.

Egy objektum, így vektor adott komponense vagy komponensei a [] zárójelek használatával jelölhető ki.
   objektum[sorszám]
   objektum[c(sorszám_1,sorszám_2)]
   objektum[sorszám_1:sorszám_n]

 Ha az operátor két oldalán lévő vektorok elemszáma eltér, akkor az általános szabály az, hogy a rövidebbik vektort az R megismétli mindaddig, míg a hosszabbik vektor elemszámát el nem éri. Ha a rövidebbik vektort nem egész számszor megismételve kapjuk a hosszabb vektort, akkor figyelmeztetést kapunk az Rtől, melyben erre a tényre felhívja a figyelmünket, de a kijelölt műveletet az R ennek ellenére végrehajtja.


Faktorok: 
A faktor a vektorhoz nagyon hasonló, homogén, egydimenziós adatszerkezet, amelyet elsősorban kategorikus változók értékeinek tárolására használunk. Faktorok esetében csak numerikus és karakteres adattípusokat használhatunk.

Olyan speciális objektumok, amelyek osztályokba sorolják a vektorok komponenseit.

A faktor tehát numerikus kódolású vektort jelent szövegértékű szintekkel. Például varianciaanalízis (analysis of variance, ANOVA) esetén az összehasonlítandó csoportok megkülönböztetendők valamilyen tényező (faktor) alapján.

 Ilyen lehet a nem, a kor, az időszak stb. Tegyük fel, hogy januári, februári és márciusi adatokat csoportosítunk. A hónapok nevei karakterláncként állnak rendelkezésünkre a honapok objektumban. Faktor típusú változó az as.factor függvénnyel hozható létre.



 Mátrixok, tömbök 
Az egydimenziós vektor többdimenziós megfelelője a tömb (array).
A tömb a vektorhoz hasonlóan homogén adatszerkezet, amely az alapvető attribútumokon túl a dim attribútummal is rendelkezik

Egy mátrix vagy tömb lehet többek közt numerikus, karakterlánc, logikai, de egy tömbön belül többféle adattípus nem alkalmazható.

Mátrix létrehozásuk módja:
   - matrix(objektum vagy érték, nrow=sorok száma, ncol=oszlopok száma, byrow = FALSE vagy TRUE)
  - array(objektum vagy érték, dim=c(dim_1, dim_2, ..., dim_n))

A mátrix alapértelmezetten oszloponként kerül feltöltésre az adatokkal. A matrix függvény byrow=TRUE paraméterével állítható be soronkénti feltöltés.

Többek között mátrixok adatainak térképes ábrázolásakor fontos, hogy tudjuk, milyen rend szerint tölti fel az R a mátrixot adatokkal, hiszen ennek hiányában tévesen pozicionálhatjuk az értékeket.


Mátrix adott sora, oszlopa vagy eleme a [] zárójelekkel jeleníthető meg: 
      objektum[sorszám,]
      objektum[,oszlopszám]
      objektum[sorszám,oszlopszám]


Mátrix adott sora vagy oszlop a következőképpen hagyható ki a megjelenítésből: 
      objektum[-sorszám,]
      objektum[,-oszlopszám]

A tömbök indexelése nagyon hasonló a vektorok indexelésére, itt is a szögletes zárójel ([]) operátort kell használnunk a tömb egyes elemeinek elérésére. Az egyetlen különbség, hogy mivel itt a dimenziók száma nagyobb mint egy, az egyes dimenzióknak megfelelően, több indexeket kell megadnunk és ezeket vesszővel választjuk el az indexoperátoron belül

Az egyes dimenziópozíciókban szereplő indexekre ugyanazok a szabályok érvényesek, mint a vektorokra. Használhatunk pozitív vagy negatív numerikus skalárokat és vektorokat, de a karakteres és logikai vektorokkal való indexelés is megengedett.



Vektorok, mátrixok összekapcsolása: 
     Vektorok mátrixokká fűzhetők össze, illetve vektor mátrixszal, valamint mátrix mátrixszal is összekapcsolható a cbind és az rbind függvényekkel.

Egy mátrix, vagy vektor típusú objektumhoz egy mátrix objektum kijelölt oszlopának kapcsolására példa:
     objektum <- cbind(objektum1, objektum2[,oszlopszám])

Egy mátrix vagy vektor típusú objektumhoz Egy mátrix objektum kijelölt sorának kapcsolására példa:
    objektum <- rbind(objektum1, objektum2[sorszám,])




Többdimenziós tömbök:

 Az array függvénnyel kettőnél több dimenziós tömböket is létrehozhatunk.

Esetenként szükségünk lehet adott dimenziójú, üres tömb létrehozatalára. Ekkor az array függvény argumentumából a tömbbe töltendő adatokat elhagyjuk, azaz, pl. 10x10x10-es üres (NA-val kitöltött) tömb létrehozatalára a következő utasítás adandó ki:
      tomb <- array(dim=(c(10,10,10)))


Listák

lista (list) típusú objektumokban különböző hosszúságú vektorok tárolhatók.A lista adatszerkezetben tehát egymás után többfajta adatot is felsorolhatunk, sem azok típusára, sem azok méretére nincs megszorítás.

A lista minden elemével a lapply() vagy az sapply() függvény segítségével hajthatunk végre műveletet
Az lapply() a bemenő lista elemszámával egyező méretű listával tér vissza, melynek értékei a második paraméterben szereplő függvény visszatérési értékei. Az sapply() hasonlóan jár el, de a visszatérési értéke egy vektor.




 Adatgenerálás 

A seq függvénnyel szabályos sorozatok hozhatók létre:
    seq(from=sorozat kezdete, to=sorozat vége, by=növekedés/csökkenés mértéke)

A sorozat tagjainak sorrendje a rev függvénnyel is megfordítható.

A rep függvény egy sorozat valahányszor történő ismétlésére alkalmazható: rep(ismétlendő sorozat, times vagy each=ismétlődés száma)

Az each paraméterrel minden egyes elem egymás után is megismételhető. Például ismételjük meg a sor4 objektum minden elemét egymást követően kétszer!
    rep(sor4, each=2) [1] 1 1 2 2 3 3 4 4 5 5 1 1 2 2 3 3 4 4 5 5



Az R-ben létrehozhatók adott valószínűségi eloszlású véletlenszám-sorozatok is.

Geometriai eloszlású, 100 tagú számsorozat képzése, p= 0,5 valószínűséggel:
  rgeom(100, p=1/2)

Poisson-eloszlású, 100 tagú számsorozat képzése, 𝜆 = 5 paraméterrel:
  rpois(100, lambda=5)

Normális eloszlású, 200 tagú számsorozat képzése, amelynek az átlaga 2 és a szórása 1:
rnorm(200, mean=2, sd=1)

 Megjegyzés: ha nem adunk meg értékeket a mean és az sd paramétereknél, vagyis az rnorm(200) utasítást adjuk ki, akkor az R alapértelmezetten standard normális eloszlásból származó adatsort generál, azaz olyan adatsort, amelynek várható értéke 1, a szórása pedig 0.  

Egyenletes eloszlású, 200 tagú számsorozat képzése, a [0,1] zárt intervallumon:
   runif(200, min=0, max=1)

A véletlen számsorozat reprodukálhatóságára az előző utasításokat megelőzően a      set.seed(azonosítószám) parancs adandó ki.

Például a következő két utasítást adjuk ki háromszor!
   set.seed(1) runif(200, min=0, max=1) 



R -es File művelet:


 Íratás fájlba, hogy „Hello, világ!”, egy sorban!
   cat("Hello", file="proba.txt")
   cat(" világ!", file="proba.txt", append=TRUE)

Sortörés az első cat függvényben a sep="\n" paraméterrel adható meg.
Az append=TRUE paraméter előtt szereplő tartalom, a példa esetében a "világ!" szó bekerül az állományba. Az alapértelmezett beállítás: append=FALSE.


A write.table függvénnyel is kiírathatók az adatsorok fájlba.
   write.table(objektumnév, "fájlnév.txt", sep="", na="NA", dec=",", col.names=TRUE vagy FALSE, row.names=TRUE vagy FALSE)


Paraméterek jelentése:
   objektumnév: Az objektum, amit ki szeretnénk íratni.
  "fájlnév.txt": A létrehozandó állomány neve.

Adott sor elemeit tagoló szimbólumot a sep paraméterrel lehet szabályozni.  sep=" " – tagolás szóközzel (alapértelmezett) sep="\t" – tagolás tabulátorral sep="," – tagolás vesszővel sep=";" – tagolás pontosvesszővel

A tizedesjel a dec paraméterrel állítható be, alapértelmezetten pont.

col.names: Az oszlopok azonosítóit tartalmazza-e az állomány. Alapértelmezetten igen. row.names:

A sorok azonosítóit tartalmazza-e az állomány. Alapértelmezetten igen. A fájl nemcsak txt kiterjesztésű lehet, hanem például prn vagy csv is.

Utóbbi kiterjesztésű állomány létrehozatalára a write.csv függvény is alkalmazható, a write.table függvényhez hasonló szintaktikával.





Megjegyzések