Шта је функција у Р?
Функција , у програмском окружењу, је скуп инструкција. Програмер гради функцију како би избегао понављање истог задатка или смањио сложеност.
Функција би требала бити
- написан за извршавање одређеног задатка
- може и не мора да укључује аргументе
- садрже тело
- може или не мора да врати једну или више вредности.
Општи приступ функцији је коришћење дела аргумента као улаза , напајање дела тела и коначно враћање резултата . Синтакса функције је следећа:
function (arglist) {#Function body}
У овом упутству ћемо научити
- Р важне уграђене функције
- Опште функције
- Математичке функције
- Статистичке функције
- Функција писања у Р.
- Када треба да напишемо функцију?
- Функције са условом
Р важне уграђене функције
У Р. има пуно уграђених функција. Р подудара ваше улазне параметре са својим аргументима функције, било по вредности или положају, а затим извршава тело функције. Аргументи функције могу имати подразумеване вредности: ако не наведете ове аргументе, Р ће узети подразумевану вредност.
Напомена : Изворни код функције могуће је видети покретањем имена саме функције у конзоли.
Видећемо три групе функција на делу
- Општа функција
- Математика функционише
- Статистичка функција
Опште функције
Већ смо упознати са општим функцијама попут функција цбинд (), рбинд (), ранге (), сорт (), ордер (). Свака од ових функција има специфичан задатак, узима аргументе за враћање резултата. Следе важне функције које треба знати:
функција дифф ()
Ако радите на временским серијама , морате да зауставите серије узимајући њихове вредности заостајања . Стационарни процес омогућава константну средњу, варијације и аутокорелацију током времена. Ово углавном побољшава предвиђање временске серије. То се лако може урадити помоћу функције дифф (). Можемо изградити случајне податке временских серија са трендом, а затим користити функцију дифф () за стационарно кретање низа. Функција дифф () прихвата један аргумент, вектор и враћа одговарајућу заосталу и поновљену разлику.
Напомена : Често морамо да стварамо случајне податке, али за учење и упоређивање желимо да бројеви буду идентични на свим машинама. Да бисмо били сигурни да сви генеришемо исте податке, користимо функцију сет.сеед () са произвољним вредностима 123. Функција сет.сеед () генерише се кроз процес стварања псеудослучајних бројева који чине да сви савремени рачунари имају исти низ бројева. Ако не користимо функцију сет.сеед (), сви ћемо имати различит низ бројева.
set.seed(123)## Create the datax = rnorm(1000)ts <- cumsum(x)## Stationary the seriediff_ts <- diff(ts)par(mfrow=c(1,2))## Plot the seriesplot(ts,)plot(diff(ts),)
функција ленгтх ()
У многим случајевима желимо да знамо дужину вектора за израчунавање или да се користи у фор петљи. Функција ленгтх () броји број редова у вектору к. Следећи кодови увозе скуп података аутомобила и враћају број редова.
Напомена : ленгтх () враћа број елемената у вектору. Ако се функција пренесе у матрицу или оквир података, враћа се број ступаца.
dt <- cars## number columnslength(dt)
Излаз:
## [1] 1
## number rowslength(dt[,1])
Излаз:
## [1] 50
Математичке функције
Р има низ математичких функција.
Оператор | Опис |
---|---|
абс (к) | Узима апсолутну вредност к |
лог (к, основа = и) | Узима логаритам к са основом и; ако база није наведена, враћа природни логаритам |
екп (к) | Даје експоненцијал к |
скрт (к) | Даје квадратни корен из к |
факторијел (к) | Даје факторијел к (к!) |
# sequence of number from 44 to 55 both including incremented by 1x_vector <- seq(45,55, by = 1)#logarithmlog(x_vector)
Излаз:
## [1] 3.806662 3.828641 3.850148 3.871201 3.891820 3.912023 3.931826## [8] 3.951244 3.970292 3.988984 4.007333
#exponentialexp(x_vector)
#squared rootsqrt(x_vector)
Излаз:
## [1] 6.708204 6.782330 6.855655 6.928203 7.000000 7.071068 7.141428## [8] 7.211103 7.280110 7.348469 7.416198
#factorialfactorial(x_vector)
Излаз:
## [1] 1.196222e+56 5.502622e+57 2.586232e+59 1.241392e+61 6.082819e+62## [6] 3.041409e+64 1.551119e+66 8.065818e+67 4.274883e+69 2.308437e+71## [11] 1.269640e+73
Статистичке функције
Р стандардна инсталација садржи широк спектар статистичких функција. У овом упутству ћемо укратко погледати најважнију функцију ...
Основне статистичке функције
Оператор |
Опис |
---|---|
средња вредност (к) |
Средња вредност к |
средња вредност (к) |
Медијана к |
вар (к) |
Одступање од к |
сд (к) |
Стандардна девијација к |
скала (к) |
Стандардне оцене (з-оцене) од к |
квантил (к) |
Квартили х |
резиме (к) |
Сажетак к: средње, мин, макс итд ... |
speed <- dt$speedspeed# Mean speed of cars datasetmean(speed)
Излаз:
## [1] 15.4
# Median speed of cars datasetmedian(speed)
Излаз:
## [1] 15
# Variance speed of cars datasetvar(speed)
Излаз:
## [1] 27.95918
# Standard deviation speed of cars datasetsd(speed)
Излаз:
## [1] 5.287644
# Standardize vector speed of cars datasethead(scale(speed), 5)
Излаз:
## [,1]## [1,] -2.155969## [2,] -2.155969## [3,] -1.588609## [4,] -1.588609## [5,] -1.399489
# Quantile speed of cars datasetquantile(speed)
Излаз:
## 0% 25% 50% 75% 100%## 4 12 15 19 25
# Summary speed of cars datasetsummary(speed)
Излаз:
## Min. 1st Qu. Median Mean 3rd Qu. Max.## 4.0 12.0 15.0 15.4 19.0 25.0
До овог тренутка научили смо пуно уграђених функција у Р.
Напомена : Будите опрезни са класом аргумента, тј. Нумеричком, логичком или низом. На пример, ако треба да проследимо вредност низа, треба да приложимо низ под наводником: „АБЦ“.
Функција писања у Р.
У неким приликама морамо да напишемо сопствену функцију, јер морамо извршити одређени задатак, а не постоји готова функција. Кориснички дефинисана функција укључује име , аргументе и тело .
function.name <- function(arguments){computations on the argumentssome other code}
Напомена : Добра пракса је именовање кориснички дефинисане функције која се разликује од уграђене функције. Избегава забуну.
Једна аргументна функција
У следећем исечку дефинишемо једноставну квадратну функцију. Функција прихвата вредност и враћа квадрат вредности.
square_function<- function(n){# compute the square of integer `n`n^2}# calling the function and passing value 4square_function(4)
Објашњење кода:
- Функција се назива квадратна_функција; може се назвати како год желимо.
- Прима аргумент „н“. Нисмо навели тип променљиве како би корисник могао да проследи цео број, вектор или матрицу
- Функција узима улаз "н" и враћа квадрат уноса.
Када завршите са употребом функције, можемо је уклонити помоћу функције рм ().
# након што креирате функцију
rm(square_function)square_function
На конзоли можемо видети поруку о грешци: Грешка: објект 'квадратна_функција' није пронађен и говори да функција не постоји.
Обим околине
У Р окружење је колекција објеката попут функција, променљивих, оквира података итд.
Р отвара окружење сваки пут када се затражи Рстудио.
Доступно окружење највишег нивоа је глобално окружење , названо Р_ГлобалЕнв. А ми имамо локално окружење.
Можемо навести садржај тренутног окружења.
ls(environment())
Оутпут
## [1] "diff_ts" "dt" "speed" "square_function"## [5] "ts" "x" "x_vector"
Можете видети све променљиве и функције креиране у Р_ГлобалЕнв.
Горња листа ће се разликовати за вас на основу историјског кода који извршавате у Р Студио.
Имајте на уму да н, аргумент функције квадратна_функција није у овом глобалном окружењу .
За сваку функцију креира се ново окружење. У горњем примеру, функција скуаре_фунцтион () ствара ново окружење унутар глобалног окружења.
Да бисмо појаснили разлику између глобалног и локалног окружења , проучимо следећи пример
Ова функција узима вредност к као аргумент и додаје је у и дефинишући споља и изнутра функције
Функција ф враћа излаз 15. То је зато што је и дефинисано у глобалном окружењу. Било која променљива дефинисана у глобалном окружењу може се локално користити. Променљива и има вредност 10 током свих позива функција и доступна је у било ком тренутку.
Погледајмо шта ће се догодити ако је променљива и дефинисана унутар функције.
Морамо испустити `и` пре покретања овог кода користећи рм р
Излаз је такође 15 када позовемо ф (5), али враћа грешку када покушавамо да одштампамо вредност и. Променљива и није у глобалном окружењу.
Коначно, Р користи најновију дефиницију променљиве за пролазак унутар тела функције. Размотримо следећи пример:
Р занемарује и вредности дефинисане изван функције јер смо експлицитно креирали аи променљиву унутар тела функције.
Функција више аргумената
Можемо написати функцију са више аргумената. Размотримо функцију која се назива „пута“. То је директна функција која множи две променљиве.
times <- function(x,y) {x*y}times(2,4)
Излаз:
## [1] 8
Када треба да напишемо функцију?
Научник података треба да уради многе задатке који се понављају. Најчешће понављамо копирање и лепљење делова кода. На пример, нормализација променљиве се препоручује пре него што покренемо алгоритам машинског учења. Формула за нормализацију променљиве је:
Већ знамо како да користимо функцију мин () и мак () у Р. За израду оквира података користимо библиотеку тиббле. Тиббле је засад најприкладнија функција за креирање скупа података од нуле.
library(tibble)# Create a data framedata_frame <- tibble(c1 = rnorm(50, 5, 1.5),c2 = rnorm(50, 5, 1.5),c3 = rnorm(50, 5, 1.5),)
У два корака ћемо израчунати горе описану функцију. У првом кораку креираћемо променљиву која се зове ц1_норм и која представља поновно скалирање ц1. У другом кораку само копирамо и налепимо код ц1_норм и мењамо са ц2 и ц3.
Детаљи функције са колоном ц1:
Номинатор:: дата_фраме $ ц1 -мин (дата_фраме $ ц1))
Именовац: мак (оквир_ података $ ц1) -мин (оквир података $ ц1))
Стога их можемо поделити да бисмо добили нормализовану вредност колоне ц1:
(data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
Можемо створити ц1_норм, ц2_норм и ц3_норм:
Create c1_norm: rescaling of c1data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))# show the first five valueshead(data_frame$c1_norm, 5)
Излаз:
## [1] 0.3400113 0.4198788 0.8524394 0.4925860 0.5067991
Функционише. Можемо копирати и налепити
data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
затим промените ц1_норм у ц2_норм и ц1 у ц2. Исто радимо и за стварање ц3_норм
data_frame$c2_norm <- (data_frame$c2 - min(data_frame$c2))/(max(data_frame$c2)-min(data_frame$c2))data_frame$c3_norm <- (data_frame$c3 - min(data_frame$c3))/(max(data_frame$c3)-min(data_frame$c3))
Савршено смо скалирали променљиве ц1, ц2 и ц3.
Међутим, овај метод је склон грешкама. Могли бисмо копирати и заборавити да променимо име колоне након лепљења. Стога је добра пракса писање функције сваки пут када треба да налепите исти код више од два пута. Код можемо преуредити у формулу и позвати га кад год је то потребно. Да бисмо написали сопствену функцију, треба да дамо:
- Назив: нормализовати.
- број аргумената: Треба нам само један аргумент, а то је колона коју користимо у рачунању.
- Тело: ово је једноставно формула коју желимо да вратимо.
Наставићемо корак по корак да креирамо функцију нормализације.
Корак 1) Израђујемо номинатора , који је. У Р, номинатор можемо сачувати у променљиву попут ове:
nominator <- x-min(x)
Корак 2) Ми смо израчунали да именитељ: . Можемо поновити идеју из корака 1 и похранити прорачун у променљиву:
denominator <- max(x)-min(x)
Корак 3) Изводимо поделу на номинатор и називник.
normalize <- nominator/denominator
Корак 4) Да бисмо вратили вредност позивајућој функцији, потребно је да пренесемо нормализу унутар ретурн () да бисмо добили излаз функције.
return(normalize)
Корак 5) Спремни смо да користимо функцију умотавањем свега у заграду.
normalize <- function(x){# step 1: create the nominatornominator <- x-min(x)# step 2: create the denominatordenominator <- max(x)-min(x)# step 3: divide nominator by denominatornormalize <- nominator/denominator# return the valuereturn(normalize)}
Тестирајмо нашу функцију променљивом ц1:
normalize(data_frame$c1)
Савршено ради. Створили смо своју прву функцију.
Функције су свеобухватнији начин извођења понављајућег задатка. Формулу за нормализацију можемо користити у различитим колонама, као у наставку:
data_frame$c1_norm_function <- normalize (data_frame$c1)data_frame$c2_norm_function <- normalize (data_frame$c2)data_frame$c3_norm_function <- normalize (data_frame$c3)
Иако је пример једноставан, можемо закључити о снази формуле. Горњи код је лакше читати и нарочито избегавати грешке приликом лепљења кодова.
Функције са условом
Понекад морамо да укључимо услове у функцију која ће омогућити да код враћа различите излазе.
У задацима машинског учења морамо скуп података поделити између комплета возова и теста. Комплет возова омогућава алгоритму да учи из података. Да бисмо тестирали перформансе нашег модела, можемо да користимо тест сет за враћање мере перформанси. Р нема функцију за стварање два скупа података. За то можемо да напишемо сопствену функцију. Наша функција узима два аргумента и назива се сплит_дата (). Идеја која стоји иза тога је једноставна, множимо дужину скупа података (тј. Број посматрања) са 0,8. На пример, ако желимо да поделимо скуп података 80/20, а наш скуп података садржи 100 редова, тада ће се наша функција помножити 0,8 * 100 = 80. 80 редова ће бити изабрано да постану наши подаци о обуци.
Ми ћемо користити податке о ваздушној квалитети за тестирање наше кориснички дефинисане функције. Скуп података о ваздушној квалитети има 153 реда. То можемо видети са доњим кодом:
nrow(airquality)
Излаз:
## [1] 153
Наставићемо како следи:
split_data <- function(df, train = TRUE)Arguments:-df: Define the dataset-train: Specify if the function returns the train set or test set. By default, set to TRUE
Наша функција има два аргумента. Влак аргумената је логички параметар. Ако је постављено на ТРУЕ, наша функција креира скуп влакова, а у супротном креира тестни скуп података.
Можемо наставити као да смо функцију нормализе (). Записујемо код као да је то само једнократни код, а затим све са тим условом умотавамо у тело да бисмо креирали функцију.
Корак 1:
Морамо израчунати дужину скупа података. То се ради помоћу функције нров (). Нров враћа укупан број редова у скупу података. Називамо променљиву дужину.
length<- nrow(airquality)length
Излаз:
## [1] 153
Корак 2:
Помножимо дужину са 0,8. Вратиће број редова за одабир. Требало би да буде 153 * 0,8 = 122,4
total_row <- length*0.8total_row
Излаз:
## [1] 122.4
Желимо да одаберемо 122 реда између 153 реда у скупу података о ваздушној квалитети. Креирамо листу која садржи вредности од 1 до тотал_ров. Резултат чувамо у променљивој која се назива сплит
split <- 1:total_rowsplit[1:5]
Излаз:
## [1] 1 2 3 4 5
сплит бира првих 122 реда из скупа података. На пример, можемо видети да наша променљива подељује вредност 1, 2, 3, 4, 5 и тако даље. Ове вредности ће бити индекс када ћемо одабрати редове које ћемо вратити.
Корак 3:
Морамо да изаберемо редове у скупу података о ваздушној квалитети на основу вредности сачуваних у сплит променљивој. Ово се ради овако:
train_df <- airquality[split, ]head(train_df)
Излаз:
##[1] Ozone Solar.R Wind Temp Month Day##[2] 51 13 137 10.3 76 6 20##[3] 15 18 65 13.2 58 5 15##[4] 64 32 236 9.2 81 7 3##[5] 27 NA NA 8.0 57 5 27##[6] 58 NA 47 10.3 73 6 27##[7] 44 23 148 8.0 82 6 13
Корак 4:
Пробни скуп података можемо створити користећи преостале редове, 123: 153. То се постиже коришћењем - испред поделе.
test_df <- airquality[-split, ]head(test_df)
Излаз:
##[1] Ozone Solar.R Wind Temp Month Day##[2] 123 85 188 6.3 94 8 31##[3] 124 96 167 6.9 91 9 1##[4] 125 78 197 5.1 92 9 2##[5] 126 73 183 2.8 93 9 3##[6] 127 91 189 4.6 93 9 4##[7] 128 47 95 7.4 87 9 5
Корак 5:
Можемо створити услов унутар тела функције. Запамтите, имамо аргумент аргумент који је логички постављен на ТРУЕ по дефаулту да би вратио скуп возова. Да бисмо креирали услов, користимо синтаксу иф:
if (train ==TRUE){train_df <- airquality[split, ]return(train)} else {test_df <- airquality[-split, ]return(test)}
То је то, можемо написати функцију. Потребно је само да променимо квалитет ваздуха у дф, јер желимо да испробамо нашу функцију у било ком оквиру података, а не само у ваздуху:
split_data <- function(df, train = TRUE){length<- nrow(df)total_row <- length *0.8split <- 1:total_rowif (train ==TRUE){train_df <- df[split, ]return(train_df)} else {test_df <- df[-split, ]return(test_df)}}
Покушајмо нашу функцију на скупу података о ваздушном ваздуху. требало би да имамо један воз састављен са 122 реда и тест сет са 31 редом.
train <- split_data(airquality, train = TRUE)dim(train)
Излаз:
## [1] 122 6
test <- split_data(airquality, train = FALSE)dim(test)
Излаз:
## [1] 31 6