4 . Kapitulua Datuak irakurri eta idatzi

Aurreko kapituluetan datu-egiturak nola sortu eta manipulatu ikusi dugu, baina askotan horrelako objektuetan jasotzen den informazioa nonbaitetik kargatu behar da. Are gehiago, kargatutako datuak landu ondoren, emaitzak gorde nahi izango dugu askotan. Kapitulu honetan datuak nola irakurtzen eta idazten diren ikusiko dugu. Gehien erabiltzen diren formatuak R lengoaiko berezko formatua eta csv-a dira.

4.1 Rko fitxategi formatua

R ingurunean sortu ditugun objektuak (bektoreak, matrizeak, etab.) zuzenean fitxategietan gorde daitezke save funtzioa erabiliz. Funtzioaren erabilera oso erraza da, lehenik objektu zerrenda bat pasatu behar diogu eta, gero, fitxategiaren izena.

matrize.bat <- matrix(1:100, ncol=10)
bektore.bat <- c("A","B","C")
save(matrize.bat, bektore.bat, file="fitxategia.RData")

Goiko kodea erabiliz sortutako bi objektuak, matrize.bat eta bektore.bat fitxategia.RData izeneko fitxategi batean gorde ditugu. Kontutan izan file argumentuari izen-bide osoa ez badiogu ematen, fitxategia R saioko lan-direktorioan gordeko dela.

Jakiteko zein den uneko lan-direktorioa getwd funtzioa erabil dezakegu. Direktorioa aldatzeko, berriz, setwd funtzioa erabil dezakegu edo, RStudio erabiliz gero, Session menuan Set Working Directory atalean aukera ezberdinak izango ditugu.

Goiko kodearekin sortzen dugun fitxategia formatu berezian dago, eta bakarrik Rn zabaldu daiteke. Horregatik, _*.RData_ hedapena erabiltzen da.

Gordetako informazioa R saioan berriro kargatzeko, load funtzioa erabil dezakegu.

rm("matrize.bat","bektore.bat") # Bi objektuak ezabatu
matrize.bat
## Error in eval(expr, envir, enclos): object 'matrize.bat' not found
load(file="fitxategia.RData") # Kargatu fitxategia
matrize.bat
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
##  [1,]    1   11   21   31   41   51   61   71   81    91
##  [2,]    2   12   22   32   42   52   62   72   82    92
##  [3,]    3   13   23   33   43   53   63   73   83    93
##  [4,]    4   14   24   34   44   54   64   74   84    94
##  [5,]    5   15   25   35   45   55   65   75   85    95
##  [6,]    6   16   26   36   46   56   66   76   86    96
##  [7,]    7   17   27   37   47   57   67   77   87    97
##  [8,]    8   18   28   38   48   58   68   78   88    98
##  [9,]    9   19   29   39   49   59   69   79   89    99
## [10,]   10   20   30   40   50   60   70   80   90   100

Lehen esan bezala, kontuz fitxategiaren bide-izenarekin, fitxategia existitzen ez bada errore bat jasoko dugu eta.

load(file="asmatutako_izena.RData")
## Warning in readChar(con, 5L, useBytes = TRUE): cannot open compressed file
## 'asmatutako_izena.RData', probable reason 'No such file or directory'
## Error in readChar(con, 5L, useBytes = TRUE): cannot open the connection

4.2 Formatu estandarrak: CSV fitxategiak

R lengoaiaren fitxategi-formatua oso erabilgarria izan arren, datuak beste programekin trukatzeko ez du balio. Are gehiago, formatua bitarra denez, ezin dugu testu-editore arruntekin _*.RData_ formatuko fitxategietan gordetako edukia bistaratu. Hori dela eta, oso ohikoa da taulak gordetzeko formatu estandarrak erabiltzea.

Fitxategi-formatu hedatuena CSVa da (comma separated values, ingelesez). Fitxategi mota hauetan errenkadak taulen errenkadak dira eta zutabeak koma edo beste karaktere baten bidez banatzen dira. Hau da, honako testu hau testu-fitxategi batean (adibidea.csv) kopiatzen badugu …

1,2,3,4,5
5,4,3,2,1
1,1,1,1,1
2,2,2,2,2

… fitxategi horren edukia R sesioan karga dezakegu read.csv funtzioa erabiliz

taula <- read.csv(file="adibidea.csv")
taula
##   X1 X2 X3 X4 X5
## 1  5  4  3  2  1
## 2  1  1  1  1  1
## 3  2  2  2  2  2

Goiko adibidean, ohartu, fitxategian lau errenkada geneuzkala idatzita, baina kargatutako taulan bakarrik hiru agertzen zaizkigu. Hori gertatzen da read.csv funtzioak lehenengo lerroa goiburuak (zutabeen izenak, alegia) izatea espero duelako. Izan ere, taulaobjektuko zutabeen izenak (X1etik X5era) lehenengo errenkadako balioak dira, aurretik X gehituta, Rn zutabeen eta errenkedeen izenak ezin baitira zenbaki batekin hasi.

Arazoa konpontzeko biderik errazena (eta egokiena), fitxategian goiburua gehitzea da, honako hau idatziz, adibidez.

A,B,C,D,E
1,2,3,4,5
5,4,3,2,1
1,1,1,1,1
2,2,2,2,2

Beste konponbidea read.csv funtzioari goibururik ez dagoela esatea da, header argumentuari FALSE balioa esleituz.

taula <- read.csv(file="adibidea.csv", header=FALSE)
taula
##   V1 V2 V3 V4 V5
## 1  1  2  3  4  5
## 2  5  4  3  2  1
## 3  1  1  1  1  1
## 4  2  2  2  2  2

Ondoren, izenak jarri diezazkiokegu zutabeei honela:

colnames(taula) <- c("A", "B", "C", "D", "E")
taula
##   A B C D E
## 1 1 2 3 4 5
## 2 5 4 3 2 1
## 3 1 1 1 1 1
## 4 2 2 2 2 2

read.csv funtzioak beste argumentu erabilgarri gehiago ere baditu (denak ikusteko funtzioaren laguntza kontsultatu ?read.csv exekutatuz):

  • sep Argumentu honek zutabeak banatzeko erabili den karaketerea definitzeko balio du. Karaktere ohikoenak ,, ;, tartea eta tabuladorea dira. Azken hori adierazteko \t kodea erabil daiteke.
  • dec Fitxategian agertzen diren balioak zenbakiak badira, Rk dezimalak . karakterearen bidez banatuta daudela suposatuko du. Beste karaktere bat erabili bada dezimalak adierazteko (,, adibidez), argumentu honen bidez definitu behar da interpretazioa ondo egiteko.
  • skip Zenbait kasutan, fitxategiaren hasieran kargatu behar ez den informazioa egon daiteke (iruzkinak, esate baterako). Argumentu honekin hasierako zenbat lerro baztertu behar diren adieraz dezakegu.

Rko terminalean sortutako matrizeak edota data.frameak CSV fitxategitan gorde daitezke, write.csv funtzioa erabiliz. Funtzionamendua read.csv funztioarenaren oso antzerakoa da, argumentu gehienak berdinak baitira. Haintzat hartzeko gauza bakarra da write.csv funtzioak, defektuz, errenkaden izenak ere gordetzen dituela beti (edo, izenik ez badute, errenkadaren indizea). Informazio hori ez badugu nahi, row.names argumentuari FALSE balioa esleitu behar diogu.

write.csv(x=taula^2, file="adibidea_karratua.csv", row.names=FALSE)
taula.berbi <- read.csv(file="adibidea_karratua.csv")
taula.berbi
##    A  B C  D  E
## 1  1  4 9 16 25
## 2 25 16 9  4  1
## 3  1  1 1  1  1
## 4  4  4 4  4  4

Goiko kodean ikus daitekeen bezala, funtzioaren lehenengo atributua gorde nahi dugun taula da (gure kasuan,taularen karratua).

4.3 Testu fitxategiak

Ohikoena ez izan arren, tarteka testu fitxategietatik irakurri edota testu fitxategietan idatzi beharko dugu. Testu fitxategietatik bai irakurtzeko eta bai bertan idazteko, hasteko, fitxategiarekin konexioa ezarri behar dugu, file funtzioa erabiliz. Funtzio horren argumentu nagusia description da, non fitxategiaren bide-izena idatzi beharko dugun.

fitxategia <- file(description="adibidea_karratua.csv")

Behin fitxategia irekita, edukia lerroz lerro irakur dezakegu readLines funtzioa erabiliz. Funtzio horrek karaktere-bektore bat itzuliko digu, non elementu bakoitza fitxategiaren lerro bat den.

lerroak <- readLines(fitxategia)
lerroak[2]
## [1] "1,4,9,16,25"
lerroak[3]
## [1] "25,16,9,4,1"

Oso garrantzitsua da fitxategia erabiltzen amaitu eta gero konexioa ixtea. Horretarako, close funtzioa erabil dezakegu.

close(fitxategia)

Fitxategia irakurri beharrean bertan idatzi behar badugu, prozedura antzerakoa erabiliko dugu (alegia, konexioa ezarri, idatzi eta gero konexioa itxi), baina oraingo honetan writeLines funtzioa erabiliko dugu nahi duguna idazteko.

fitxategia <- file(description="testu_fitxategia.txt")
writeLines("Nire testu fitxategia", con=fitxategia)
writeLines("---------------------", con=fitxategia) 
writeLines("\tLerro bat", con=fitxategia)
writeLines("\tBeste lerro bat", con=fitxategia)
close(fitxategia)

Goiko adibideak testu_fitxategia.txt izeneko fitxategi bat sortzen du. Bertan, lau lerro idatzi ditugu, bakoitza writeLines funtzioari behin dei eginez. Adibidean oso ohikoa den karaktere berezi bat agertzen da, \t, tabuladorea sartzeko erabiltzen dena.

4.3.1 Terminalaren irteera

Kasu berezi moduan, R terminalean agertzen dena ere fitxategi batean idatzi/kopiatu daiteke sink funtzioa erabiliz. Fitxategi hauek normalean _*.Rout_ hedapena izaten dute. sink funtzioa exekutatzen dugunean, hortik aurrera terminalean agertzen diren irteera guztiak aukeratutako fitxategi horretan idatziko dira.

sink(file="Rko_irteera.Rout")
4+4
## [1] 8
c("Testu", "bat")
## [1] "Testu" "bat"
sink()

fitxategia <- file("Rko_irteera.Rout")
readLines(con=fitxategia)
## character(0)
close(fitxategia)

Goiko adibidean sink funtzioa bi bider erabili dugu. Lehenengoan irteera(k) Rko_irteera.Rout fitxategian idazteko da. Bigarrena, argumenturik ez duena, fitxategiarekin konexioa itxi eta berriro irteerak terminalean idazteko da. Irteera bakarrik fitxategian agertzea nahi ez badugu (hau da, terminalean ere agertzea nahi badugu), split argumentuari TRUE balioa eman behar diogu.

sink(file="Rko_irteera.Rout", split=TRUE)
4+4
## [1] 8
c("Testu", "bat")
## [1] "Testu" "bat"
sink()

fitxategia <- file("Rko_irteera.Rout")
readLines(con=fitxategia)
## character(0)
close(fitxategia)

4.4 Hedapenak

Aurreko ataletan CSV eta testuko fitxategiak nola idatzi/irakurri ikusi dugu. Atal honetan bi hedapen ikusiko ditugu. Alde batetik, fitxategi konprimatuak nola erabili aztertuko dugu eta, bestetik, sarean dauden fitxategiak nola atzitu erakutsiko dugu.

4.4.1 Fitxategi konprimatuak

Testu fitxategiak (CSVak barne) ez dira oso bide eraginkorra informazioa gordetzeko. Hori dela eta, zenbait egoeratan informazioa konprimatzeko premia izango dugu. R lengoaian informazioa fitxategi konprimatutan gordetzea oso erraza da, gzfile funtzioa erabiliz. Adibidez, aurreko ataletan erabili dugun matrizea fitxategi konprimatu batean gordetzeko hau egin dezakegu.

fitxategia <- gzfile(description="adibidea_bikoitza.csv.gz")
write.csv(x=taula*2, file=fitxategia, row.names=FALSE)

Irakurtzea are errazagoa da, fitxategia konprimatuta egon arren era berdinean irakurtzen baita.

taula.bikoitza <- read.csv(file="adibidea_bikoitza.csv.gz")
taula.bikoitza
##    A B C D  E
## 1  2 4 6 8 10
## 2 10 8 6 4  2
## 3  2 2 2 2  2
## 4  4 4 4 4  4

4.4.2 Sareko fitxategiak

Kapitulu honetan zehar file funtzioa erabili dugu diskoan dauden fitxategiekin konexioak ezartzeko. Fitxategiak zerbitzari batean egonez gero, url funtzioa erabil dezakegu konexioa ezartzeko. Hortik aurrera, era berdinean irakur dezakegu fitxategia.

f <- url(description="http://www.stats.ox.ac.uk/pub/datasets/csb/ch11b.dat")
edukia <- read.csv(file=f, header=FALSE, sep=" ")
head(edukia)
##   V1  V2   V3    V4 V5
## 1  1 307  930 36.58  0
## 2  2 307  940 36.73  0
## 3  3 307  950 36.93  0
## 4  4 307 1000 37.15  0
## 5  5 307 1010 37.23  0
## 6  6 307 1020 37.24  0

4.5 Ariketak

1. Ariketa Gorde .RData fitxategi batean Rko saioan dituzun objetu guztiak. Gogoratu ls funtzioak saioko objektuen zerrenda itzultzen duela.

2. Ariketa Erabili testu editore bat (edo kalkulu-orri bat) goiburua duen CSV fitxategi bat sortzeko. Bertan hiru zutabe sortu, Izena, NAN eta Nota izenekoak. Sartu asmatutako datuak (nota zenbaki bat izan behar da), gorde fitxategia eta kargatu R terminalean. Ondo kargatu dira datuak? Kargatutako datuetan Nota zutabea numeric da? Ez bada, nola konponduko zenuke?

3. Ariketa Aurreko ariketan sortutako datuak erabiliz, idatzi, testu fitxategi batean, “Izena, zure nota Nota da.” esaldia ikasle bakoitzarentzat, errenkada bakoitzeko lerro bat idatziz.

4. ariketa Sartu Eustateko webgunean eta menuan aukeratu Gaiak. Bertan aukeratu Biztanleria->Biztanleriaren Mugimenduak->Jaiotzak eta aukeratu “Estatistika taulak”. Aukeren artean topatu “100 neska-izen ugarienen zerrenda” eta datuak csv formatuan deskargatu. Kargatu datuak eta fitxategi batean idatzi, komaz banatuta, gehien errepikatzen diren 10 izenak (lerro bat urte bakoitzeko).

5. Ariketa Sartu Eustateko webgunean eta menuan aukeratu Datu bankua. Bertan aukeratu Gizartea->Hezkuntza->Eskolatze-maila eta bertan lehenengo sarrera aukeratu. Egin eremu aukeraketa bat, esportatu datuak CSV fitxategi batera eta R terminalean kargatu datuak.