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
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.
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 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")
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.
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
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
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:
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
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
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