R Programlamadaki Fonksiyonlar (Örnekle)

R'de İşlev nedir?

Bir programlama ortamında bir işlev , bir talimatlar dizisidir. Bir programcı , aynı görevi tekrar etmekten kaçınmak veya karmaşıklığı azaltmak için bir işlev oluşturur .

Bir işlev olmalıdır

  • belirli bir görevi yerine getirmek için yazılmış
  • argümanlar içerebilir veya içermeyebilir
  • bir vücut içerir
  • bir veya daha fazla değer döndürebilir veya döndürmeyebilir.

Bir işleve genel bir yaklaşım, argüman bölümünü girdi olarak kullanmak , vücut bölümünü beslemek ve son olarak bir çıktı döndürmektir . Bir işlevin Sözdizimi aşağıdaki gibidir:

function (arglist) {#Function body}

Bu eğitimde öğreneceğiz

  • R önemli yerleşik işlevler
  • Genel fonksiyonlar
  • Matematik fonksiyonları
  • İstatistiksel fonksiyonlar
  • R'de yazma işlevi
  • Ne zaman fonksiyon yazmalıyız?
  • Koşullu işlevler

R önemli yerleşik işlevler

R'de birçok yerleşik işlev vardır. R, girdi parametrelerinizi değer veya konuma göre işlev bağımsız değişkenleriyle eşleştirir, ardından işlev gövdesini çalıştırır. İşlev bağımsız değişkenlerinin varsayılan değerleri olabilir: Bu bağımsız değişkenleri belirtmezseniz, R varsayılan değeri alır.

Not : Bir işlevin kaynak kodunu konsolda işlevin adını çalıştırarak görmek mümkündür.

Eylemde üç grup işlev göreceğiz

  • Genel işlev
  • Matematik işlevi
  • İstatistiksel işlev

Genel fonksiyonlar

Cbind (), rbind (), range (), sort (), order () fonksiyonları gibi genel fonksiyonlara zaten aşinayız. Bu işlevlerin her birinin belirli bir görevi vardır, bir çıktı döndürmek için bağımsız değişkenler alır. Aşağıdakiler bilinmesi gereken önemli işlevlerdir.

fark () işlevi

Zaman serileri üzerinde çalışıyorsanız, serileri gecikme değerlerini alarak durağanlaştırmanız gerekir . Bir durağan süreç zaman içinde sabit ortalama, varyans ve otokorelasyon sağlar. Bu, esas olarak bir zaman serisinin tahminini geliştirir. Diff () fonksiyonu ile kolaylıkla yapılabilir. Bir eğilim ile rastgele bir zaman serisi verileri oluşturabilir ve ardından seriyi durağanlaştırmak için diff () işlevini kullanabiliriz. Diff () işlevi bir bağımsız değişkeni, bir vektörü kabul eder ve uygun gecikmeli ve yinelenen fark döndürür.

Not : Genellikle rastgele veriler oluşturmamız gerekir, ancak öğrenme ve karşılaştırma için sayıların makineler arasında aynı olmasını isteriz. Hepimizin aynı verileri ürettiğinden emin olmak için, rastgele 123 değerleriyle set.seed () işlevini kullanıyoruz. Set.seed () işlevi, her modern bilgisayarı aynı sıraya sahip yapan sözde rasgele sayı üreteci işlemiyle üretilir. sayılar. Set.seed () işlevini kullanmazsak, hepimiz farklı sayı dizisine sahip oluruz.

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),)

uzunluk () işlevi

Çoğu durumda, hesaplama için bir vektörün uzunluğunu bilmek veya bir for döngüsünde kullanmak isteriz . Length () işlevi, x vektöründeki satır sayısını sayar. Aşağıdaki kodlar otomobil veri kümesini içe aktarır ve satır sayısını döndürür.

Not : length (), bir vektördeki öğelerin sayısını döndürür. İşlev bir matrise veya veri çerçevesine aktarılırsa, sütun sayısı döndürülür.

dt <- cars## number columnslength(dt)

Çıktı:

## [1] 1
## number rowslength(dt[,1])

Çıktı:

## [1] 50

Matematik fonksiyonları

R'nin bir dizi matematiksel işlevi vardır.

Şebeke Açıklama
abs (x) X'in mutlak değerini alır
günlük (x, taban = y) X'in y tabanındaki logaritmasını alır; taban belirtilmezse, doğal logaritmayı döndürür
exp (x) X'in üstelini verir
sqrt (x) X'in karekökünü verir
faktöryel (x) X (x!) Faktöriyelini verir
# sequence of number from 44 to 55 both including incremented by 1x_vector <- seq(45,55, by = 1)#logarithmlog(x_vector)

Çıktı:

## [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)

Çıktı:

## [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)

Çıktı:

## [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

İstatistiksel fonksiyonlar

R standart kurulumu çok çeşitli istatistiksel fonksiyonlar içerir. Bu eğiticide, en önemli işleve kısaca bakacağız…

Temel istatistik fonksiyonları

Şebeke

Açıklama

ortalama (x)

X'in ortalaması

medyan (x)

X'in medyanı

var (x)

X'in varyansı

sd (x)

X'in standart sapması

ölçek (x)

X'in standart puanları (z-puanları)

kuantil (x)

X çeyrekleri

özet (x)

X'in özeti: ortalama, minimum, maksimum vb.

speed <- dt$speedspeed# Mean speed of cars datasetmean(speed)

Çıktı:

## [1] 15.4
# Median speed of cars datasetmedian(speed)

Çıktı:

## [1] 15
# Variance speed of cars datasetvar(speed)

Çıktı:

## [1] 27.95918
# Standard deviation speed of cars datasetsd(speed)

Çıktı:

## [1] 5.287644
# Standardize vector speed of cars datasethead(scale(speed), 5)

Çıktı:

## [,1]## [1,] -2.155969## [2,] -2.155969## [3,] -1.588609## [4,] -1.588609## [5,] -1.399489
# Quantile speed of cars datasetquantile(speed)

Çıktı:

## 0% 25% 50% 75% 100%## 4 12 15 19 25
# Summary speed of cars datasetsummary(speed)

Çıktı:

## Min. 1st Qu. Median Mean 3rd Qu. Max.## 4.0 12.0 15.0 15.4 19.0 25.0

Bu noktaya kadar, birçok R yerleşik işlevi öğrendik.

Not : Argümanın sınıfına, yani sayısal, Boolean veya dizge gibi dikkatli olun. Örneğin, bir dize değeri iletmemiz gerekirse, dizeyi tırnak işareti içine almamız gerekir: "ABC".

R'de yazma işlevi

Bazı durumlarda, kendi işlevimizi yazmamız gerekir çünkü belirli bir görevi yerine getirmemiz gerekir ve hazır işlev yoktur. Kullanıcı tanımlı bir işlev bir isim , bağımsız değişkenler ve bir gövde içerir .

function.name <- function(arguments){computations on the argumentssome other code}

Not : Kullanıcı tanımlı bir işlevi yerleşik bir işlevden farklı olarak adlandırmak iyi bir uygulamadır. Karışıklığı önler.

Bir bağımsız değişken işlevi

Bir sonraki parçada basit bir kare işlevi tanımlıyoruz. Fonksiyon bir değeri kabul eder ve değerin karesini döndürür.

square_function<- function(n){# compute the square of integer `n`n^2}# calling the function and passing value 4square_function(4)

Kod Açıklaması:

  • İşlev kare_işlev olarak adlandırılır; ne istersek çağrılabilir.
  • Bir "n" argümanı alır. Biz kullanıcı bir tamsayı, bir vektör ya da bir matris geçirebilmesi için değişkenin türünü belirtmek vermedi
  • Fonksiyon "n" girişini alır ve girişin karesini döndürür.

    Fonksiyonu kullanmayı bitirdiğinizde, onu rm () fonksiyonu ile kaldırabiliriz.

# işlevi oluşturduktan sonra

rm(square_function)square_function

Konsolda bir hata mesajı görebiliriz: Hata: 'square_function' nesnesi, fonksiyonun mevcut olmadığını söyleyen bulunamadı.

Çevre Kapsamı

R'de ortam , işlevler, değişkenler, veri çerçevesi vb. Gibi nesnelerin bir koleksiyonudur .

R, Rstudio her istendiğinde bir ortam açar.

Mevcut en üst düzey ortam , R_GlobalEnv adlı küresel ortamdır . Ve yerel çevremiz var.

Mevcut ortamın içeriğini listeleyebiliriz.

ls(environment())

Çıktı

## [1] "diff_ts" "dt" "speed" "square_function"## [5] "ts" "x" "x_vector"

R_GlobalEnv'de oluşturulan tüm değişkenleri ve işlevi görebilirsiniz.

Yukarıdaki liste, R Studio'da çalıştırdığınız geçmiş koda bağlı olarak sizin için değişiklik gösterecektir.

N, square_function işlevinin bağımsız değişkeninin bu global ortamda olmadığına dikkat edin .

Bir yeni çevre her işlev için yaratılmıştır. Yukarıdaki örnekte, square_function () işlevi global ortam içinde yeni bir ortam yaratır.

Küresel ve yerel çevre arasındaki farkı açıklığa kavuşturmak için aşağıdaki örneği inceleyelim

Bu fonksiyon, argüman olarak bir x değeri alır ve onu fonksiyonun dışında ve içinde tanımlayan y'ye ekler

F işlevi çıktı 15'i döndürür. Bunun nedeni y'nin global ortamda tanımlanmış olmasıdır. Global ortamda tanımlanan herhangi bir değişken yerel olarak kullanılabilir. Y değişkeni, tüm işlev çağrıları sırasında 10 değerine sahiptir ve herhangi bir zamanda erişilebilir.

Bakalım y değişkeni fonksiyonun içinde tanımlanmışsa ne olacak.

Bu kodu rm r kullanarak çalıştırmadan önce "y" yi bırakmamız gerekiyor

F (5) 'i çağırdığımızda çıktı da 15'tir, ancak y değerini yazdırmaya çalıştığımızda bir hata verir. Y değişkeni global ortamda değil.

Son olarak, R, bir fonksiyonun gövdesine geçmek için en son değişken tanımını kullanır. Şu örneği ele alalım:

R, işlevin dışında tanımlanan y değerlerini göz ardı eder, çünkü işlevin gövdesi içinde açıkça bir ay değişkeni oluşturduk.

Çoklu argüman işlevi

Birden fazla argüman içeren bir fonksiyon yazabiliriz. "Times" adlı işlevi düşünün. İki değişkeni çarpan basit bir fonksiyondur.

times <- function(x,y) {x*y}times(2,4)

Çıktı:

## [1] 8

Ne zaman fonksiyon yazmalıyız?

Veri bilimcinin birçok tekrar eden görevi yapması gerekir. Çoğu zaman, kod parçalarını tekrar tekrar kopyalayıp yapıştırırız. Örneğin, bir makine öğrenimi algoritması çalıştırmadan önce bir değişkenin normalleştirilmesi şiddetle tavsiye edilir. Bir değişkeni normalleştirme formülü şöyledir:

R'de min () ve max () işlevini nasıl kullanacağımızı zaten biliyoruz. Veri çerçevesini oluşturmak için tibble kitaplığını kullanıyoruz. Tibble, sıfırdan bir veri kümesi oluşturmak için şimdiye kadar en uygun işlevdir.

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),)

Yukarıda açıklanan işlevi hesaplamak için iki adımda ilerleyeceğiz. İlk adımda, c1'in yeniden ölçeklendirilmesi olan c1_norm adında bir değişken oluşturacağız. İkinci adımda, c1_norm kodunu kopyalayıp yapıştırıyoruz ve c2 ve c3 ile değiştiriyoruz.

İşlevin c1 sütunuyla ayrıntısı:

Nominator:: data_frame $ c1 -min (data_frame $ c1))

Payda: max (data_frame $ c1) -min (data_frame $ c1))

Bu nedenle, c1 sütununun normalleştirilmiş değerini elde etmek için bunları bölebiliriz:

(data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1)) 

C1_norm, c2_norm ve c3_norm oluşturabiliriz:

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)

Çıktı:

## [1] 0.3400113 0.4198788 0.8524394 0.4925860 0.5067991

İşe yarıyor. Kopyalayıp yapıştırabiliriz

data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))

sonra c1_norm'u c2_norm'a ve c1'i c2'ye değiştirin. C3_norm oluşturmak için aynısını yapıyoruz

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))

C1, c2 ve c3 değişkenlerini mükemmel şekilde yeniden ölçeklendirdik.

Ancak, bu yöntem hata yapmaya meyillidir. Yapıştırdıktan sonra sütun adını kopyalayıp değiştirmeyi unutabiliriz. Bu nedenle, aynı kodu ikiden fazla yapıştırmanız gerektiğinde bir işlev yazmak iyi bir uygulamadır. Kodu bir formül halinde yeniden düzenleyebilir ve gerektiğinde çağırabiliriz. Kendi fonksiyonumuzu yazmak için vermemiz gerekenler:

  • İsim: normalleştir.
  • argümanların sayısı: Sadece bir argümana ihtiyacımız var, bu da hesaplamamızda kullandığımız sütun.
  • Vücut: Bu, geri dönmek istediğimiz formüldür.

Normalize işlevini oluşturmak için adım adım ilerleyeceğiz.

Adım 1) Aday olanı yaratıyoruz . R'de, nominatorü aşağıdaki gibi bir değişkende saklayabiliriz:

nominator <- x-min(x)

Adım 2) Biz hesaplamak paydayı: . 1. adım fikrini kopyalayabilir ve hesaplamayı bir değişkende saklayabiliriz:

denominator <- max(x)-min(x)

Adım 3) Aday ve payda arasındaki bölünmeyi gerçekleştiriyoruz.

normalize <- nominator/denominator

Adım 4) Çağıran işleve değer döndürmek için işlevin çıktısını almak için return () içinde normalize etmemiz gerekir.

return(normalize)

Adım 5) Her şeyi braketin içine sararak işlevi kullanmaya hazırız.

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)}

Fonksiyonumuzu c1 değişkeni ile test edelim:

normalize(data_frame$c1)

Mükemmel çalışıyor. İlk fonksiyonumuzu yarattık.

İşlevler, tekrar eden bir görevi gerçekleştirmenin daha kapsamlı bir yoludur. Normalize formülünü aşağıdaki gibi farklı sütunlar üzerinde kullanabiliriz:

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)

Örnek basit olsa da, bir formülün gücünü çıkarabiliriz. Yukarıdaki kodun okunması daha kolaydır ve özellikle kodları yapıştırırken hatalardan kaçının.

Koşullu işlevler

Bazen, kodun farklı çıktılar döndürmesine izin vermek için bir işleve koşullar eklememiz gerekir.

Makine Öğrenimi görevlerinde, veri setini bir tren seti ile bir test seti arasında bölmemiz gerekir. Tren seti, algoritmanın verilerden öğrenmesine izin verir. Modelimizin performansını test etmek için, performans ölçüsünü döndürmek için test setini kullanabiliriz. R'nin iki veri kümesi oluşturma işlevi yoktur. Bunu yapmak için kendi fonksiyonumuzu yazabiliriz. Fonksiyonumuz iki argüman alır ve split_data () olarak adlandırılır. Arkasındaki fikir basit, veri setinin uzunluğunu (yani gözlem sayısını) 0,8 ile çarpıyoruz. Örneğin, 80/20 veri setini bölmek istiyorsak ve veri setimiz 100 satır içeriyorsa, fonksiyonumuz 0.8 * 100 = 80'i çarpacaktır. Eğitim verimiz olması için 80 satır seçilecektir.

Kullanıcı tanımlı fonksiyonumuzu test etmek için hava kalitesi veri setini kullanacağız. Hava kalitesi veri kümesinde 153 satır vardır. Bunu aşağıdaki kodla görebiliriz:

nrow(airquality)

Çıktı:

## [1] 153 

Aşağıdaki gibi ilerleyeceğiz:

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

Fonksiyonumuzun iki argümanı vardır. Argümanlar dizisi bir Boole parametresidir. TRUE olarak ayarlanmışsa, işlevimiz tren veri kümesini oluşturur, aksi takdirde test veri kümesini oluşturur.

Normalize () fonksiyonunu yaptığımız gibi devam edebiliriz. Kodu tek seferlik bir kodmuş gibi yazıyoruz ve ardından işlevi oluşturmak için koşullu her şeyi gövdeye sarıyoruz.

Aşama 1:

Veri setinin uzunluğunu hesaplamamız gerekiyor. Bu, nrow () işlevi ile yapılır. Nrow, veri kümesindeki toplam satır sayısını döndürür. Değişken uzunluk diyoruz.

length<- nrow(airquality)length

Çıktı:

## [1] 153

Adım 2:

Uzunluğu 0,8 ile çarpıyoruz. Seçilecek satır sayısını döndürür. 153 * 0.8 = 122.4 olmalıdır.

total_row <- length*0.8total_row

Çıktı:

## [1] 122.4

Hava kalitesi veri setindeki 153 satır arasından 122 satır seçmek istiyoruz. 1'den total_row'a kadar değerler içeren bir liste oluşturuyoruz. Sonucu split adlı değişkende saklıyoruz

split <- 1:total_rowsplit[1:5] 

Çıktı:

## [1] 1 2 3 4 5

split, veri kümesinden ilk 122 satırı seçer. Örneğin, değişken bölümümüzün 1, 2, 3, 4, 5 vb. Değerlerini topladığını görebiliriz. Bu değerler, döndürülecek satırları seçtiğimizde indeks olacaktır.

Aşama 3:

Split değişkeninde depolanan değerlere göre hava kalitesi veri setindeki satırları seçmemiz gerekir. Bu şu şekilde yapılır:

train_df <- airquality[split, ]head(train_df)

Çıktı:

##[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. Adım:

Kalan satırlar olan 123: 153'ü kullanarak test veri setini oluşturabiliriz. Bu, bölmenin önünde - kullanılarak yapılır.

test_df <- airquality[-split, ]head(test_df)

Çıktı:

##[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

Adım 5:

Fonksiyonun gövdesi içinde durumu yaratabiliriz. Unutmayın, tren kümesini döndürmek için varsayılan olarak TRUE olarak ayarlanmış bir Boole olan bir argüman trenimiz var. Koşulu oluşturmak için if sözdizimini kullanırız:

if (train ==TRUE){train_df <- airquality[split, ]return(train)} else {test_df <- airquality[-split, ]return(test)}

İşte bu, fonksiyonu yazabiliriz. Yalnızca hava kalitesini df olarak değiştirmemiz gerekiyor çünkü işlevimizi yalnızca hava kalitesine değil, herhangi bir veri çerçevesine de denemek istiyoruz:

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)}}

Fonksiyonumuzu hava kalitesi veri setinde deneyelim. 122 sıralı bir tren setimiz ve 31 sıralı bir test setimiz olmalı.

train <- split_data(airquality, train = TRUE)dim(train)

Çıktı:

## [1] 122 6
test <- split_data(airquality, train = FALSE)dim(test)

Çıktı:

## [1] 31 6

Ilginç makaleler...