celsius <- c(0:4*10)
farenheit <- 9/5*celsius+32
conversion <- data.frame(Celsius=celsius, Farenheit = farenheit)
print (conversion)
## Celsius Farenheit
## 1 0 32
## 2 10 50
## 3 20 68
## 4 30 86
## 5 40 104
myReturn<-function(x) c(NA, diff(x)/x[-length(x)]) #ova funkcija je dobra jer racuna stopu rasta unutar jedne varijable.
myReturn (conversion$Celsius) #Ovdje primjenjujemo funkciju koju smo napisali, zamislimo da svaka obzervacija predstavlja temp. u celsiusima odredjenog dana.
## [1] NA Inf 1.0000000 0.5000000 0.3333333
growthrate <- function (x,y) {(y-x)/x}
growthrate (conversion$Celsius,conversion$Farenheit) #zamislimo da nas interesuje odnos izmedju celsiusa i farenheita
## [1] Inf 4.000000 2.400000 1.866667 1.600000
Dobra stvar kod funkcija je sto mozete da ih sacuvate. Dakle one koje su vama potrebne spasite i onda mozete da ih pozovete kad zelite kad radite neku analizu. To vam svakako savjetujem. Sami sa sobomo vidite sta najcesce koristite napisite tu funkciju ako vec nema u R-u i koristite je.
Najpoznatije loop funkcije su iz *apply porodice. To su: 1. lapply
3. sapply
3. tapply
4. vapply
Zajednicko kod apply funkcija je taj da ce da PODIJELI neke podatke u manje dijelove, da primjeni neku funkciju na svaki dio, i onda komparira rezultate. Na engleskom to je: split, apply i combine.
Vise o tome mozete procitati : “The Split-Apply-Combine Strategy for Data Analysis” by H.wickham.
Lapply
Ova funkcija uzima listu kao input i aplicira je na svaki element liste i onda vrati listu jednake duzine kao orginal.
Lapply = L znaci lista
Npr.
titanic <- as.data.frame(Titanic)
tit_list <- lapply (titanic, class)
tit_list
## $Class
## [1] "factor"
##
## $Sex
## [1] "factor"
##
## $Age
## [1] "factor"
##
## $Survived
## [1] "factor"
##
## $Freq
## [1] "numeric"
Na ovaj nacin smo aplicirali class () funkciju na cijleli data frame. tj. na sve varijable.
Posto je tit_list ima klasu liste, a ova klasa je najpogodnija za cuvanje vise klasa podataka i ima raylicite duzine. U ovom slucaju posto je jednakaka duzina listu mozemo sacuvati kao karakter.
tit_karak <- as.character(tit_list)
tit_karak
## [1] "factor" "factor" "factor" "factor" "numeric"
Primjer2. (Intermediate dio)
kardio <- read.csv2("~/alma master/amra0705.csv")
Recimo da zelimo da uradimo wilcox.test u jednom kodu za vise varijabli.
x<-lapply (kardio[,c("IVSd", "LA", "AV")], function (x) wilcox.test (x~kardio$seropoz.neg))
x
## $IVSd
##
## Wilcoxon rank sum test with continuity correction
##
## data: x by kardio$seropoz.neg
## W = 444, p-value = 0.3071
## alternative hypothesis: true location shift is not equal to 0
##
##
## $LA
##
## Wilcoxon rank sum test with continuity correction
##
## data: x by kardio$seropoz.neg
## W = 558.5, p-value = 0.4264
## alternative hypothesis: true location shift is not equal to 0
##
##
## $AV
##
## Wilcoxon rank sum test with continuity correction
##
## data: x by kardio$seropoz.neg
## W = 142, p-value = 0.6982
## alternative hypothesis: true location shift is not equal to 0
Sapply
s stoji za simplify.
Primjenjuje se kao lapply.
tit_vect <- sapply (titanic, class)
tit_vect
## Class Sex Age Survived Freq
## "factor" "factor" "factor" "factor" "numeric"
tit_levels <- sapply (titanic$Class, levels)
tit_levels
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] "1st" "1st" "1st" "1st" "1st" "1st" "1st" "1st" "1st" "1st"
## [2,] "2nd" "2nd" "2nd" "2nd" "2nd" "2nd" "2nd" "2nd" "2nd" "2nd"
## [3,] "3rd" "3rd" "3rd" "3rd" "3rd" "3rd" "3rd" "3rd" "3rd" "3rd"
## [4,] "Crew" "Crew" "Crew" "Crew" "Crew" "Crew" "Crew" "Crew" "Crew" "Crew"
## [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
## [1,] "1st" "1st" "1st" "1st" "1st" "1st" "1st" "1st" "1st" "1st"
## [2,] "2nd" "2nd" "2nd" "2nd" "2nd" "2nd" "2nd" "2nd" "2nd" "2nd"
## [3,] "3rd" "3rd" "3rd" "3rd" "3rd" "3rd" "3rd" "3rd" "3rd" "3rd"
## [4,] "Crew" "Crew" "Crew" "Crew" "Crew" "Crew" "Crew" "Crew" "Crew" "Crew"
## [,21] [,22] [,23] [,24] [,25] [,26] [,27] [,28] [,29] [,30]
## [1,] "1st" "1st" "1st" "1st" "1st" "1st" "1st" "1st" "1st" "1st"
## [2,] "2nd" "2nd" "2nd" "2nd" "2nd" "2nd" "2nd" "2nd" "2nd" "2nd"
## [3,] "3rd" "3rd" "3rd" "3rd" "3rd" "3rd" "3rd" "3rd" "3rd" "3rd"
## [4,] "Crew" "Crew" "Crew" "Crew" "Crew" "Crew" "Crew" "Crew" "Crew" "Crew"
## [,31] [,32]
## [1,] "1st" "1st"
## [2,] "2nd" "2nd"
## [3,] "3rd" "3rd"
## [4,] "Crew" "Crew"
Vapply
Omogucava da specificiramo koji format zelimo. tj. kad je funkcija sapply onda je output kako r odluci. Ako je vapply onda mi odlucujemo. Ako smo pogresno odlucili onda dobijemo error. Npr. kad je kod sapply(titanic, class)
dobijemo clasu za svaku varijablu.A kad je kod: vapply (titanic, class, character(1))
onda je output vektor duzine jedan.
vapply (titanic, class, character(1))
## Class Sex Age Survived Freq
## "factor" "factor" "factor" "factor" "numeric"
Tapply
Tapply aplicira funkciju na x varijablu za svaku y varijablu.
Primjer: ako zelimo da saznamo medju onima koji nisu prezivjeli koliko ih je bilo iz koje klase. Prvo formirajmo dataframe.
library (dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
no.surv<-filter(titanic, Survived=="No")
pa onda
tapply (no.surv$Freq,no.surv$Class, summary)
## $`1st`
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0 0.0 2.0 30.5 32.5 118.0
##
## $`2nd`
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 0.00 6.50 41.75 48.25 154.00
##
## $`3rd`
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 17.0 30.5 62.0 132.0 163.5 387.0
##
## $Crew
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0 0.0 1.5 168.2 169.8 670.0
$Freq
je numericka varijabla, $Class
je faktor.
Rezultat nam pokazuje da je broj poginulih na titaniku povezan i sa klasama u kojima su bili ptunici. Medju osobljem i trecom klasom ima najvise poginulih.