7. Funkcije sustava R¶
Funkcija je skupina izraza koja izvršava neki zadatak.
Osnovna sintaksa svake funkcije je:
ime_funkcije <- function(argument1, argument2, ...){
izraz1
izraz2
...
}
Svaka funkcija ima svoj naziv po kojem se poziva.
Argumenti su ulazni podaci koji trebaju funkciji da izvrši neki zadatak.
Funkcija može, a i ne mora imati argumente, i argumenti mogu imati unaprijed zadane vrijednosti.
Funkcije iz grupe apply¶
Funkcije iz obitelji apply alternativna su rješenja za petlje, odnosno mehanizam koji koristimo umjesto višestrukog izvršavanja istoga programskog kôda.
Koristit ćemo:
apply()
lapply()
sapply()
tapply()
- te dodatnu funkciju
aggregate()
Funkcija apply()¶
Izgled funkcije:
apply(X, MARGIN, FUNC) gdje je:
- X matrica
- MARGIN oznaka da li se radi o retku ili stupcu (1 za retke, 2 za stupce)
- FUNC funkcija koja će se primijenjivati na retke ili stupce (MARGIN) matrice X.
Primjer
Kreirajmo matricu koja sadrži sve parne brojeve manje od 20, dimenzija 3x3.
Supcima dajte imena A, B i C, a redcima I, II i III.
Izračunajte prosjeke svih stupaca ove matrice i dodajte ih kao posljednji redak naziva "IV" u tu matricu.
Zatim izračunajte zbrojeve redaka i dodajte ih kao posljednji supac ove matrice, naziva "D".
Rješenje treba izgledati ovako:
A | B | C | D | |
---|---|---|---|---|
I | 2 | 8 | 14 | 24 |
II | 4 | 10 | 16 | 30 |
III | 6 | 12 | 18 | 36 |
IV | 4 | 10 | 16 | 30 |
matrica <- matrix(2*c(1:9), 3, 3)
colnames(matrica)=c("A", "B", "C")
rownames(matrica)=c("I", "II", "III")
IV <- apply(matrica, 2, mean)
matrica <- rbind(matrica, IV)
D <- apply(matrica, 1, sum)
matrica <- cbind(matrica, D)
matrica
A | B | C | D | |
---|---|---|---|---|
I | 2 | 8 | 14 | 24 |
II | 4 | 10 | 16 | 30 |
III | 6 | 12 | 18 | 36 |
IV | 4 | 10 | 16 | 30 |
Funkcija lapply()¶
Funkcija lapply() je proširenje funkcije apply() koje se može primijeniti i na podatkovne okvire (data frames) i liste, a rezultat se vraća isključivo u obliku liste (odakle dolazi i L u nazivu funkcije).
Izgled funkcije:
lapply(X, FUNC, . . .) gdje je:
- X vektor ili lista, a sve ostalo će biti automatski pretvoreno u listu
- FUNC funkcija koja će se primijenjivati nad X
- . . . dodatne opcije funkcije FUNC
Primjer
Kreirajte podatkovni okvir studenti s imenima studenata, njihovim visinama i njihovom starosti:
- ime: Ana, Ivan, Marko, Petra
- dob: 27, 32, 21, 24
- visina: 1.63, 1.82, 1.70, 1.68
Primjenite funkciju mean
pomoću lapply()
na dob i visinu da bi izračunali prosječnu visinu i dob.
studenti <- data.frame(
ime = c("Ana", "Ivan", "Marko", "Petra"),
dob = c(27, 32, 21, 24),
visina = c(1.63, 1.82, 1.70, 1.68)
)
lapply(studenti[,2:3], mean)
- $dob
- 26
- $visina
- 1.7075
Zadatak
Kreirajte podatkovni okvir auti od ova četiri vektora s njihovim pripadnim vrijednostima:
- proizvođač: Ford, Toyota, Chevrolet
- model: Mustang, Corolla, Camaro
- godište: 2010, 2015, 2012
- cijena: 12000, 15000, 18000
- Kreirajte podatkovni okvir auti2 koji će sadržavati sve podatke iz podatkovnog okvira auti u tekstualnom obliku (koristiti:
as.character
) - Kreirajte podatkovni okvir auti3 koji će sve tekstualne podatke iz podatkovnog okvira auti pretvoriti u velika slova (koristiti:
toupper
)
auti <- data.frame(
proizvođač = c("Ford", "Toyota", "Chevrolet"),
model = c("Mustang", "Corolla", "Camaro"),
godište = c(2010, 2015, 2012),
cijena = c(12000, 15000, 18000))
lapply(auti, as.character)
lapply(auti, function(x) if (is.character(x)) toupper(x) else x)
- $proizvođač
-
- 'Ford'
- 'Toyota'
- 'Chevrolet'
- $model
-
- 'Mustang'
- 'Corolla'
- 'Camaro'
- $godište
-
- '2010'
- '2015'
- '2012'
- $cijena
-
- '12000'
- '15000'
- '18000'
- $proizvođač
-
- 'FORD'
- 'TOYOTA'
- 'CHEVROLET'
- $model
-
- 'MUSTANG'
- 'COROLLA'
- 'CAMARO'
- $godište
-
- 2010
- 2015
- 2012
- $cijena
-
- 12000
- 15000
- 18000
Funkcija sapply()¶
Funkcija sapply() radi isto što i lapply(), osim što za rezultat vraća najjednostavniju moguću strukturu podataka.
Na primjer, ako je moguće umjesto liste vratiti odgovor u obliku vektora, sapply() će to i napraviti (s u nazivu dolazi od simplify)
Primjer
Kreirajte podatkovni okvir ljudi koji sadrži informacije o četiri osobe sa sljedećim vrijednostima:
- imena: Ana, Boris, Branka, Dario
- dob: 24, 32, 45, 19
- spol: "ženski", "muški", "ženski", "muški"
Zatim primijenite funkciju sapply() na stupcu dob kako bi dobili dvostruke vrijednosti dobi svake osobe.
Rezultat spremite u varijablu godine i ispišite ju na način:
Varijabla 'godine' ima vrijednosti: 48 64 90 38
Ispišite tip podatka za varijablu godine da bude oblika:
Varijabla 'godine' je tipa: numeric
Ponovite postupak koristeći funkciju lapply() opet ispišite vrijednosti i tip varijable.
ljudi <- data.frame(
ime = c("Ana", "Boris", "Branka", "Dario"),
dob = c(24, 32, 45, 19),
spol = c("ženski", "muški", "ženski", "muški")
)
print(ljudi)
godine <- sapply(ljudi$dob, function(x) x*2)
cat("\nVarijabla 'godine' ima vrijednosti: ", godine)
cat("\nVarijabla 'godine' je tipa: ",class(godine))
godine2 <- lapply(ljudi$dob, function(x) x*2)
godine2
cat("\nVarijabla 'godine2' je tipa: ",class(godine2))
ime dob spol 1 Ana 24 ženski 2 Boris 32 muški 3 Branka 45 ženski 4 Dario 19 muški Varijabla 'godine' ima vrijednosti: 48 64 90 38 Varijabla 'godine' je tipa: numeric
- 48
- 64
- 90
- 38
Varijabla 'godine2' je tipa: list
Funkcije tapply() i aggregate¶
Funkcija tapply() dijeli podatkovni skup u kategorije, te za svaku kategoriju izračuna traženu funkciju.
Analiza podataka često zahtjeva računanje ili uspoređivanje svojstava prema podgrupama nekoga skupa podataka, na primjer, da se podaci podijele po spolu, državi, gradu, razredu, itd., i to često dovodi do zanimljivih otkrića.
Izgled funkcije:
tapply(X, INDEX, FUNC = NULL) gdje je:
- X - podatkovni skup, po mogućnosti vektor, za koji je moguće napraviti podjelu po kategorijama
- INDEX - lista elemenata po kojoj se određuju kategorije
- FUNC - funkcija koja se primijenjuje na svaku podgrupu
Primjer
Funkcija tapply() primjenjuje funkciju na vrijednosti podataka grupiranih prema drugom vektoru.
Kreirajte podatkovni okvir studenti s imenima studenata, njihovim visinama i njihovom dobi kako je navedeno:
- ime: Ana, Ivan, Marko, Petra
- dob = 21, 24, 21, 24
- visina = 1.63, 1.82, 1.70, 1.68
Koristeći funkciju tapply() izračunajte prosječnu visinu za svaku dob iz podatkovnog okvira.
studenti <- data.frame(
ime = c("Ana", "Ivan", "Marko", "Petra"),
dob = c(21, 24, 21, 24),
visina = c(1.63, 1.82, 1.70, 1.68)
)
prosjek_po_godinama <- tapply(studenti$visina, studenti$dob, mean)
cat("\nProsjek visina za gledano po dobi studenta:\n")
print(prosjek_po_godinama)
Prosjek visina za gledano po dobi studenta: 21 24 1.665 1.750
Sličan rezultat bi dobili i funkcijom aggregate. Tako bi za uneseni podatkovni okvir studenti prosjek visina gledano po dobi studenta mogli izračunati ovako:
cat("\nProsjek visina za gledano po dobi studenta:\n")
aggregate(studenti$visina, list(Godine = studenti$dob), mean)
Prosjek visina za gledano po dobi studenta:
Godine | x |
---|---|
<dbl> | <dbl> |
21 | 1.665 |
24 | 1.750 |