Učitavanje i čuvanje datoteka

R ima svoj format za čuvanje baza podataka (datoteka), ali može koristiti gotovo sve ostale formate statističkih softvera. R-ov izvorni format ima ekstenzije .Rda i najprikladniji je (najlakše je učitava i čuva) i najefikasniji (zauzima puno manje prostora od ostalih formata).

Da biste objekat koji sadrži datoteku sačuvali u R-ovom formatu, jednostavno morate upotrijebiti naredbu save(), đe se prvi argument odnosi na ime objekta koji želimo sačuvati, a drugi argument na ime datoteke koju želite kreirati. Na primjer, ako bismo željeli sačuvati datoteku koju smo na prethodnom času kreirali pod nazivom “baza_1”, morali bismo upotrijebiti naredbu save(data, file = "baza_1.Rda"). Ovo će sačuvati vašu datoteku u radni folder. Ako datoteke želite sačuvati neđe drugo, morate navesti putanju do foldera zajedno s imenom datoteke.

Učitavanje R datoteke je jednako lako. Naredba load("baza_1.Rda") učitat će datoteku s tim imenom iz vašeg radnog foldera

Ako korisnik radi samo s R, onda je najrazumnije koristiti vlastiti R format. Ako neko radi na drugom softveru, upravljanje drugim formatima može predstavljati problem.

Prije nego počnemo sa radom, potrebno je da učitamo prethnodno instalirane R pakete koji će nam biti potrebni za rad sa datotekama:

rm(list = ls()) # funkcija kojom čistimo radnu površinu

library('foreign') # Paket "foreign" čemo koristit za učitavanje baza kreiranih u drugim statističkim programima
library('car') # Paket "car" ćemo koristiti za rekodiranje varijabli

CSV fajlovi

Možda najkompatibilniji format podataka koji koriste različiti tipovi statističkih softvera je CSV format, koji označava “comma separated values” (vrijednosti odvojene zarezom). CSV fajlovi se mogu koristiti za čuvanje datotetka i mogu se koristiti u govotovo svim programima, od Excela do SPSS-a. Datoteka odvojena zarezom u osnovi je tekstualna datoteka, đe svaki red odgovara svakom redu u okviru podataka, a vrijednosti u kolonama odvojene su zarezima

U R-u možemo učitati u CSV datoteku uz pomoć naredbe read.csv(). Prvi argument navodi ime datoteke i putanju do radnog foldera. U slučaju da se datoteka već nalazi u radnom folderu, nije nužno specifikovati putanju do njega. Header argument zahtijeva logičku vrijednost i označava je da li datoteka ima red zaglavlja (koji sadrži imena varijabli). Argument sep označava znak koji se koristi za odvajanje vrijednosti različitih kolona.

Prvo podesimo radni folder na isti način kao i na prethodnom predavanju:

setwd("~/Desktop/NMPI/") 

Učitajmo bazu podataka pod imenom baza.csv iz radnog foldera:

data <- read.csv("~/Desktop/NMPI/baza.csv", sep = ",", header= T)

Pomoću naredbe write.csv() možete sačuvati CSV datoteku jednako lako kao i učitati je. Prvi argument odnosi se na ime objekta, datoteka navodi put do datoteke, sep označava znak koji se koristi za odvajanje vrijednosti u svakom redu. Ako ne koristite imena redova, možda ćete htjeti i argument row.names postaviti na FALSE kako biste osigurali pravilno čuvanje datoteke.

write.csv(data, "baza_2.csv")

Nakon što ste bazu podataka sačuvali u radni folder, obavezno provjerite da li je sve u redu i da li odgovara onome što vidite u pregledu podataka u RStudio.

SPSS fajlovi

Najednostavniji način za učitavanje SPSS datoteke u R je upotreba funkcije read.spss iz foreign paketa. Argument file specifikuje putanju do datoteke. Postavite argument use.value.labels na FALSE ako ne želite da R uvozi samo oznake koje SPSS koristi za označavanje određenih vrijednosti u podacima. Ovo je relevantno za faktore. Generalno je dobro reći R-u da ne koristi SPSS oznake vrijednosti, jer često mogu predstavljati smetnju. Upotrijebite argument to.data.frame sa vrijednošću TRUE za učitavanje SPSS datoteke. U suprotnom će funkcija učitati mnogo komplikovaniji objekat koji sadrži razne informacije o SPSS datoteci, koje nam nijesu potrebne. Za naprednu upotrebu podataka, potonja opcija bi mogla biti potrebna, ali za generalnu upotrebu nije.

Funkcija read.spss često će vas upozoriti da je naišla na tip zapise (record) koji ne prepoznaje. Ovo je problem sa SPSS-om, a ne s problemom R i slobodno ga možete ignorisati.

data <- read.spss("~/Desktop/NMPI/baza.csv/baza.sav", to.data.frame = TRUE, use.value.labels = FALSE)

STATA fajlovi

STATA datoteke se mogu uvesti u R pomoću funkcije read.dta. Kao prvi argument morate navesti put do datoteke, a za ostatak se možete uputiti koristeći dokumentaciju ove funkcije. Važno je imati na umu da ova funkcija može učitavati datoteke stvorene samo sa STATA verzijom 5-12. Za novije verzije može se koristiti funkcija read.dta13 iz paketa readstata13. Primjer učitavanja novije STATA datoteke u R bi izgledao ovako:

data <- read.dta13("baza.dta")

Datoteke dostupne u R

R dolazi s nizom primjera datoteka, od kojih su neki poznati iz istorije pojedinih disciplina (npr. Anscombeov kvartet), a koje je moguće lako učitati i koristiti za trening. Osim toga, mnogi paketi koje instalirate uključuju sopstvene datoteke. Može se pogledati puna lista baza koji dolaze u R-u koristeći naredbu data(paket = .packages (all.available = TRUE)) i učitati ih naredbom data() navodeći ime datoteke kao jedini argument. Dodatne informacije o datotekama možete viđeti upisivanjem imena datoteke ispred kojih stoji upitnik.

Sumiranje podataka

U R-u postoje brojni načini da se ispita skup podataka, a mi ćemo razmotriti samo neke od najvažnijih. Prva stvar koju biste željeli učiniti je vidjeti koliko redova i koliko kolona ima vaša datoteka. Možete to učiniti ovako:

dim(data)
[1] 8 4

Ako nas zanimaju samo imena varijabli, možemo koristiti funkciju colnames ():

colnames(data)
[1] "Ime" "Pol" "God" "Obr"

Prve obzervacije unutar datoteke (prvih 6) možemo pogledati koristeći naredbu head():

head(data)
     Ime Pol God Obr
1  Marko   M  23  17
2 Bojana   Z  20  13
3 Nikola   M  28   9
4   Sara   Z  28  19
5 Milica   Z  25  19
6 Jovana   Z  21  14

Datoteka sadrži 8 redova koji predstavljaju toliko pojedinaca. Za svakog od 8 pojedinaca zabilježne su 4 karakteristike: ime, pol, godine i obrazovanje.

Napomena: Imajte na umu da su redovi uvijek na prvom mjestu, a kolone na drugom mjestu.

Da bismo dobili ideju o vrstama varijabli s kojima radimo, možemo koristiti naredbu str() koja nam pokazuje strukturu objekta koji nas zanima. Ova naredba ne radi samo s datotekama već sa svim vrstama objekata.

str(data)
'data.frame':   8 obs. of  4 variables:
 $ Ime: Factor w/ 8 levels "Bojana","Jovan",..: 4 1 6 7 5 3 2 8
 $ Pol: Factor w/ 2 levels "M","Z": 1 2 1 2 2 2 1 2
 $ God: int  23 20 28 28 25 21 35 30
 $ Obr: int  17 13 9 19 19 14 13 24

Naredba str() prikazuje nam nazive kolona (varijable) (kojima prethodi $), njihov tip (int - cijeli broj, chr - znak, numerički; cijeli broj odnosi se na brojeve bez decimala, dok numerički uključuje brojeve s decimalama).

Da bismo dobili sažetak svih varijabli, možemo koristiti funkciju summary(). Ovo će nam pokazati osnovne informacije o svakoj varijabli.

summary(data)
      Ime    Pol        God             Obr      
 Bojana :1   M:3   Min.   :20.00   Min.   : 9.0  
 Jovan  :1   Z:5   1st Qu.:22.50   1st Qu.:13.0  
 Jovana :1         Median :26.50   Median :15.5  
 Marko  :1         Mean   :26.25   Mean   :16.0  
 Milica :1         3rd Qu.:28.50   3rd Qu.:19.0  
 Nikola :1         Max.   :35.00   Max.   :24.0  
 (Other):2                                       

Primijetićete da ovo djeluje samo za numeričke (intervalne) varijable, za koje su mjere poput prosjeka i medijana izračunljive. Ako želimo dobiti opis kategorijskih varijabli, koje su predstavljene kao vektori znakova, poput imena u ovom slučaju, moramo primijeniti drugačiji pristup.

Na primjer, moglo bi nas zanimati kako su slučajevi raspoređeni po kategorijama ordinalne varijable. Jednostavan način da to pogledate je naredba table(). Pogledajmo varijablu “Pol”.

table(data$Pol)

M Z 
3 5 
table(data[,2])

M Z 
3 5 

Spajanje datoteka

Kad radimo sa bazama podataka, gotovo nikada nije slučaj da cijela datoteka koju koristite sadrži samo podatke koji su vam potrebni ili vas zanimaju uredno sadržani. Iz toga razloga nerijetko je potrebno podijeliti ili spojiti baze podataka prema vašim željama.

Već smo viđeli kako spojiti vektore zajedno u jednu datoteku pomoću naredbe data.frame ().

data
     Ime Pol God Obr
1  Marko   M  23  17
2 Bojana   Z  20  13
3 Nikola   M  28   9
4   Sara   Z  28  19
5 Milica   Z  25  19
6 Jovana   Z  21  14
7  Jovan   M  35  13
8 Tamara   Z  30  24

U bazi podatka zabilježene su informacije o osam osoba. Pretpostavimo da imamo informacije o tim ljudima na u zasebnoj datoteci. (Za potrebe vježbe izmislićemo novu datoteku sa varijablama “Var1” i “Var2”).

Var1 <- c(1.34, 3.12, 5.0, 4.2, 2.1, 4.12, 2.34, 3.78)
Var2 <- c(4, 1, 8, 2, 1, 6, 5, 3)
Var3 <- c(2,3,5,1,2,3,2,4)
data1 <- data.frame(Var1, Var2, Var3)
data1
  Var1 Var2 Var3
1 1.34    4    2
2 3.12    1    3
3 5.00    8    5
4 4.20    2    1
5 2.10    1    2
6 4.12    6    3
7 2.34    5    2
8 3.78    3    4

Ako imamo dva skupa podataka s jednakim brojem redova (i pod pretpostavkom da naravno redovi odgovaraju istim ljudima), možemo ih spojiti s naredbom cbind (), koja dodaje više kolona u postojeću datoteku.

Ako imamo dva skupa podataka s jednakim brojem kolona, pod uslovom da su imena varijabli ista u obje baze, možemo ih spojiti s naredbom rbind (), koja dodaje redove u postojeću datoteku.

data2 <- cbind(data, data1)
data2
     Ime Pol God Obr Var1 Var2 Var3
1  Marko   M  23  17 1.34    4    2
2 Bojana   Z  20  13 3.12    1    3
3 Nikola   M  28   9 5.00    8    5
4   Sara   Z  28  19 4.20    2    1
5 Milica   Z  25  19 2.10    1    2
6 Jovana   Z  21  14 4.12    6    3
7  Jovan   M  35  13 2.34    5    2
8 Tamara   Z  30  24 3.78    3    4

Provjerimo što smo dobili:

head(data2)
     Ime Pol God Obr Var1 Var2 Var3
1  Marko   M  23  17 1.34    4    2
2 Bojana   Z  20  13 3.12    1    3
3 Nikola   M  28   9 5.00    8    5
4   Sara   Z  28  19 4.20    2    1
5 Milica   Z  25  19 2.10    1    2
6 Jovana   Z  21  14 4.12    6    3

Ukoliko želimo da promijenimo imena varijabli:

colnames(data2) <- c("Ime","Pol","God","Obr","Pros","Prim","DomBr")
data2
     Ime Pol God Obr Pros Prim DomBr
1  Marko   M  23  17 1.34    4     2
2 Bojana   Z  20  13 3.12    1     3
3 Nikola   M  28   9 5.00    8     5
4   Sara   Z  28  19 4.20    2     1
5 Milica   Z  25  19 2.10    1     2
6 Jovana   Z  21  14 4.12    6     3
7  Jovan   M  35  13 2.34    5     2
8 Tamara   Z  30  24 3.78    3     4

Metodi spajanja baza podataka koje smo do sada naučili pretpostavljaju da je redosljed redova u obje datotetke identičan. Međutim, to nije uvijek slučaj jer se podaci o istim osobama, državama i institucijama nalaze na različitim mjestima. Iz tog razloga, često se od istraživača zahtijeva da informacije o istim obzervacijama spoje iz više postojećih baza na način koji garantuje da su podaci tačni.

Jedan od načina kako možemo uraditi je koristeći funkciju merge(). Potrebno je specifikovati imena datoteka koje pokušavamo spojiti, kao i ime varijable na osnovu koje spajanje vršimo - argument by.

data_nova <- read.csv("~/Desktop/NMPI/baza_nova.csv", sep = ",", header= T) #učitavanje nove baze podataka

data2 <- merge(data2,data_nova, by.x="Ime") # spajanje dvije baze "data2" i "data_nova" koristeći varijablu "Ime".

data2
     Ime Pol God Obr Pros Prim DomBr Grad
1 Bojana   Z  20  13 3.12    1     3   NK
2  Jovan   M  35  13 2.34    5     2   HN
3 Jovana   Z  21  14 4.12    6     3   PV
4  Marko   M  23  17 1.34    4     2   PG
5 Milica   Z  25  19 2.10    1     2   BA
6 Nikola   M  28   9 5.00    8     5   KO
7   Sara   Z  28  19 4.20    2     1   CT
8 Tamara   Z  30  24 3.78    3     4   UL

Veoma često, istraživači imaju potrebu da u datoteku dodaju nove varijable koje su nastaju mijenjanjem već postojećih:

data2$RelPrim <- data2$Prim/data2$DomBr
data2
     Ime Pol God Obr Pros Prim DomBr Grad   RelPrim
1 Bojana   Z  20  13 3.12    1     3   NK 0.3333333
2  Jovan   M  35  13 2.34    5     2   HN 2.5000000
3 Jovana   Z  21  14 4.12    6     3   PV 2.0000000
4  Marko   M  23  17 1.34    4     2   PG 2.0000000
5 Milica   Z  25  19 2.10    1     2   BA 0.5000000
6 Nikola   M  28   9 5.00    8     5   KO 1.6000000
7   Sara   Z  28  19 4.20    2     1   CT 2.0000000
8 Tamara   Z  30  24 3.78    3     4   UL 0.7500000

Vidimo da nova varijable ima dosta decimala, što veoma lako možemo izmijeniti korišćenjem funkcije round() u kojoj ćemo specifikovati koliko decimalnih borjeva želimo.

Dobra praksa u slučaju kreiranje novih varijabli ili rekodiranja postojećih prvo naredbu testirati.

data2$RelPrim_test <- round(data2$RelPrim,2) # Kreiranje test varijable koja bi trebala imati iste vrijednosti kao i "RelPrim" ali sa svega 2 decimalne cifre.
data2
     Ime Pol God Obr Pros Prim DomBr Grad   RelPrim RelPrim_test
1 Bojana   Z  20  13 3.12    1     3   NK 0.3333333         0.33
2  Jovan   M  35  13 2.34    5     2   HN 2.5000000         2.50
3 Jovana   Z  21  14 4.12    6     3   PV 2.0000000         2.00
4  Marko   M  23  17 1.34    4     2   PG 2.0000000         2.00
5 Milica   Z  25  19 2.10    1     2   BA 0.5000000         0.50
6 Nikola   M  28   9 5.00    8     5   KO 1.6000000         1.60
7   Sara   Z  28  19 4.20    2     1   CT 2.0000000         2.00
8 Tamara   Z  30  24 3.78    3     4   UL 0.7500000         0.75

Sve izgleda u redu, pa možemo funkciju primijeniti na varijabli koju koristimo i izbrisati priveremeno kreiranu varijablu RelPrim_test.

data2$RelPrim_test <- NULL # inputovanjem vrijednosti NULL mozemo jednostavno izbrisati iz datoteke
data2$RelPrim <- round(data2$RelPrim,2)
data2
     Ime Pol God Obr Pros Prim DomBr Grad RelPrim
1 Bojana   Z  20  13 3.12    1     3   NK    0.33
2  Jovan   M  35  13 2.34    5     2   HN    2.50
3 Jovana   Z  21  14 4.12    6     3   PV    2.00
4  Marko   M  23  17 1.34    4     2   PG    2.00
5 Milica   Z  25  19 2.10    1     2   BA    0.50
6 Nikola   M  28   9 5.00    8     5   KO    1.60
7   Sara   Z  28  19 4.20    2     1   CT    2.00
8 Tamara   Z  30  24 3.78    3     4   UL    0.75

Razdvajanje datoteka

Istraživači nerijetko imaju potrebu da cjelokupnu ili dio analize sprovedu isključivo na određenom dijelu (poduzorku) datoteke. Bilo da se radi o tome da baza sadrži veliku količinu nepotrebnih podataka ili da na podatke želite primijeniti drugačiji tip analize, razdrajanje (“subsetting”) datoteke sastavni dio je svake detaljnije analize.Postoji više načina na koji možemo pristupiti ovom problemu:

Odabir obzervacija

Najjednostavniji način je direktno specifikovanje koje redove i kolone želimo imati u novoj datoteci. Ovaj metod funkcioniše na isti način kao i manipulisanje svakog drugog vektora.

r_data_1 <- data2[c(1:4),c(1:3)]# kreiranje nove baze podataka koja sadrži prva 4 reda i prve 3 kolone iz baze podataka "data2".
r_data_1
     Ime Pol God
1 Bojana   Z  20
2  Jovan   M  35
3 Jovana   Z  21
4  Marko   M  23

Odabir varijabli

Ukoliko u novoj bazi želimo imati sve obzervacije (redove) ali nam nijesu potrebne sve varijable, to možemo uraditi na sljedeći način:

vars <- c("Ime", "Pol","Grad") # kreiranje objekta koji sadrži imena varijabli koje želimo da nova baza ima.
r_data_2 <- data2[vars] # izdvajanje samo varijabli sačuvanih u objektu vars
r_data_2
     Ime Pol Grad
1 Bojana   Z   NK
2  Jovan   M   HN
3 Jovana   Z   PV
4  Marko   M   PG
5 Milica   Z   BA
6 Nikola   M   KO
7   Sara   Z   CT
8 Tamara   Z   UL

Odabir vrijednosti

Ukoliko u novoj bazi želimo imati samo obzervacije koje ispunjavaju određene uslove ili imaju karakteristike za koje smo zainteresovani kao istraživači, možemo koristiti funkciju subset(). Na primjer, ukoliko želimo u posebnu datoteku sačuvati osobe ženskog pola:

r_data_3 <- subset(data2, Pol=="Z") # poduzorak žena
r_data_3
     Ime Pol God Obr Pros Prim DomBr Grad RelPrim
1 Bojana   Z  20  13 3.12    1     3   NK    0.33
3 Jovana   Z  21  14 4.12    6     3   PV    2.00
5 Milica   Z  25  19 2.10    1     2   BA    0.50
7   Sara   Z  28  19 4.20    2     1   CT    2.00
8 Tamara   Z  30  24 3.78    3     4   UL    0.75
r_data_3 <- subset(data2, Prim > 5) # poduzorak osoba koje čija mjesečna primanja domaćinstva su preko 500 eura
r_data_3
     Ime Pol God Obr Pros Prim DomBr Grad RelPrim
3 Jovana   Z  21  14 4.12    6     3   PV     2.0
6 Nikola   M  28   9 5.00    8     5   KO     1.6
r_data_3 <- subset(data2, Prim < 5 & Pol == "M") # poduzorak mučkih osoba koje čija mjesečna primanja su ispod 500 eura
r_data_3
    Ime Pol God Obr Pros Prim DomBr Grad RelPrim
4 Marko   M  23  17 1.34    4     2   PG       2