Fungsi dalam Pemrograman R dengan Contoh

Apa itu Fungsi di R?

A fungsi, dalam lingkungan pemrograman, adalah sekumpulan instruksi. Seorang programmer membangun fungsi yang harus dihindari mengulangi tugas yang sama, atau dikurangi kompleksitas.

Suatu fungsi seharusnya

  • ditulis untuk melaksanakan tugas tertentu
  • mungkin menyertakan atau tidak menyertakan argumen
  • berisi tubuh
  • mungkin atau mungkin tidak mengembalikan satu atau lebih nilai.

Pendekatan umum terhadap suatu fungsi adalah dengan menggunakan bagian argumen sebagai input, memberi makan tubuh bagian dan akhirnya mengembalikan an keluaranSintaksis suatu fungsi adalah sebagai berikut:

function (arglist)  {
  #Function body
}

R fungsi bawaan yang penting

Ada banyak fungsi bawaan di R. R mencocokkan parameter input Anda dengan argumen fungsinya, baik berdasarkan nilai atau posisi, lalu mengeksekusi isi fungsi. Argumen fungsi dapat memiliki nilai default: jika Anda tidak menentukan argumen ini, R akan mengambil nilai default.
Note:
Kode sumber suatu fungsi dapat dilihat dengan menjalankan nama fungsi itu sendiri di konsol.

R Fungsi Bawaan Penting

Kita akan melihat tiga kelompok fungsi beraksi

  • Fungsi umum
  • Fungsi matematika
  • Fungsi statistik

Fungsi umum

Kita sudah familiar dengan fungsi-fungsi umum seperti fungsi cbind(), rbind(),range(),sort(),order(). Masing-masing fungsi ini memiliki tugas tertentu, mengambil argumen untuk mengembalikan output. Berikut ini adalah fungsi-fungsi penting yang harus diketahui:

perbedaan() fungsi

Jika Anda bekerja pada seri waktu, Anda perlu stasioner seri tersebut dengan mengambilnya nilai ketertinggalan. Sebuah proses stasioner memungkinkan mean, varians, dan autokorelasi yang konstan dari waktu ke waktu. Hal ini terutama meningkatkan prediksi deret waktu. Ini dapat dengan mudah dilakukan dengan fungsi diff(). Kita dapat membuat data deret waktu acak dengan tren dan kemudian menggunakan fungsi diff() untuk stasioner deret tersebut. Fungsi diff() menerima satu argumen, sebuah vektor, dan mengembalikan perbedaan lag dan iterasi yang sesuai.

Note: Kita sering kali perlu membuat data acak, tetapi untuk pembelajaran dan perbandingan, kita ingin angka-angkanya identik di semua mesin. Untuk memastikan kita semua menghasilkan data yang sama, kita menggunakan fungsi set.seed() dengan nilai acak 123. Fungsi set.seed() dihasilkan melalui proses pembangkit angka pseudorandom yang membuat setiap komputer modern memiliki urutan angka yang sama. Jika kita tidak menggunakan fungsi set.seed(), kita semua akan memiliki urutan angka yang berbeda.

set.seed(123)
## Create the data
x = rnorm(1000)
ts <- cumsum(x)
## Stationary the serie
diff_ts <- diff(ts)
par(mfrow=c(1,2))
## Plot the series
plot(ts, type='l')
plot(diff(ts), type='l')

Perbedaan() Fungsi

fungsi panjang()

Dalam banyak kasus, kita ingin mengetahui panjangnya vektor untuk perhitungan atau untuk digunakan dalam for loop. Fungsi length() menghitung jumlah baris dalam vektor x. Kode berikut mengimpor dataset mobil dan mengembalikan jumlah baris.

Note: length() mengembalikan jumlah elemen dalam vektor. Jika fungsi diteruskan ke matriks atau bingkai data, jumlah kolom akan dikembalikan.

dt <- cars
## number columns
length(dt)

Keluaran:

## [1] 1
## number rows
length(dt[,1])

Keluaran:

## [1] 50

Fungsi matematika

R memiliki larik fungsi matematika.

Operator Uraian Teknis
abs (x) Mengambil nilai mutlak dari x
log(x,basis=y) Mengambil logaritma dari x dengan basis y; jika basis tidak ditentukan, mengembalikan logaritma natural
exp (x) Mengembalikan eksponensial dari x
sqrt (x) Mengembalikan akar kuadrat dari x
faktorial(x) Mengembalikan faktorial dari x (x!)
# sequence of number from 44 to 55 both including incremented by 1
x_vector <- seq(45,55, by = 1)
#logarithm
log(x_vector)

Keluaran:

##  [1] 3.806662 3.828641 3.850148 3.871201 3.891820 3.912023 3.931826
##  [8] 3.951244 3.970292 3.988984 4.007333
#exponential
exp(x_vector)
#squared root
sqrt(x_vector)

Keluaran:

##  [1] 6.708204 6.782330 6.855655 6.928203 7.000000 7.071068 7.141428
##  [8] 7.211103 7.280110 7.348469 7.416198
#factorial
factorial(x_vector)

Keluaran:

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

Fungsi statistik

Instalasi standar R berisi berbagai fungsi statistik. Dalam tutorial ini, kita akan melihat secara singkat fungsi yang paling penting..

Fungsi statistik dasar

Operator Uraian Teknis
berarti(x) Rata-rata x
median(x) Median dari x
var(x) Varians x
SD(x) Simpangan baku x
skala(x) Skor standar (skor-z) x
kuantil(x) Kuartil dari x
ringkasan(x) Ringkasan x: mean, min, max dll.
speed <- dt$speed
speed
# Mean speed of cars dataset
mean(speed)

Keluaran:

## [1] 15.4
# Median speed of cars dataset
median(speed)

Keluaran:

## [1] 15
# Variance speed of cars dataset
var(speed)

Keluaran:

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

Keluaran:

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

Keluaran:

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

Keluaran:

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

Keluaran:

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

Hingga saat ini, kita telah mempelajari banyak fungsi bawaan R.

Note: Hati-hati dengan kelas argumen, yaitu numerik, Boolean atau string. Misalnya, jika kita perlu meneruskan nilai string, kita perlu mengapit string tersebut dalam tanda kutip: “ABC” .

Tulis fungsi di R

Dalam beberapa kesempatan, kita perlu menulis fungsi kita sendiri karena kita harus menyelesaikan tugas tertentu dan tidak ada fungsi yang siap pakai. Fungsi yang ditentukan pengguna melibatkan a nama, argumen dan tubuh.

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

Note: Praktik yang baik adalah memberi nama fungsi yang ditentukan pengguna berbeda dari fungsi bawaan. Ini menghindari kebingungan.

Satu fungsi argumen

Pada cuplikan berikutnya, kita mendefinisikan fungsi persegi sederhana. Fungsi ini menerima nilai dan mengembalikan kuadrat nilainya.

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

Penjelasan Kode

  • Fungsi tersebut diberi nama square_function; itu bisa disebut apapun yang kita inginkan.
  • Ia menerima argumen “n”. Kami tidak menentukan jenis variabel sehingga pengguna dapat meneruskan bilangan bulat, vektor, atau matriks
  • Fungsi ini mengambil masukan “n” dan mengembalikan kuadrat masukan. Ketika Anda selesai menggunakan fungsi tersebut, kita dapat menghapusnya dengan fungsi rm().

# setelah Anda membuat fungsinya

rm(square_function)
square_function

Di konsol, kita dapat melihat pesan kesalahan :Error: object 'square_function' not found yang memberitahukan bahwa fungsi tersebut tidak ada.

Pelingkupan Lingkungan

Di R, itu lingkungan Hidup adalah koleksi objek seperti fungsi, variabel, bingkai data, dll.

R membuka lingkungan setiap kali Rstudio diminta.

Lingkungan tingkat atas yang tersedia adalah lingkungan global, disebut R_GlobalEnv. Dan kami memilikinya lingkungan lokal.

Kita dapat membuat daftar konten lingkungan saat ini.

ls(environment())

Keluaran

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

Anda dapat melihat semua variabel dan fungsi yang dibuat di R_GlobalEnv.

Daftar di atas akan bervariasi untuk Anda berdasarkan kode historis yang Anda jalankan di R Studio.

Perhatikan bahwa n, argumen dari fungsi square_function adalah tidak dalam lingkungan global ini.

A yang baru lingkungan dibuat untuk setiap fungsi. Dalam contoh di atas, fungsi square_function() menciptakan lingkungan baru di dalam lingkungan global.

Untuk memperjelas perbedaan antara global dan lingkungan lokal, mari kita pelajari contoh berikut ini

Fungsi ini mengambil nilai x sebagai argumen dan menambahkannya ke definisi y di luar dan di dalam fungsi

Pelingkupan Lingkungan

Fungsi f mengembalikan keluaran 15. Hal ini karena y didefinisikan dalam lingkungan global. Variabel apa pun yang ditentukan dalam lingkungan global dapat digunakan secara lokal. Variabel y memiliki nilai 10 selama semua pemanggilan fungsi dan dapat diakses kapan saja.

Mari kita lihat apa yang terjadi jika variabel y didefinisikan di dalam fungsi.

Kita perlu membuang `y` sebelum menjalankan kode ini menggunakan rm r

Pelingkupan Lingkungan

Outputnya juga 15 ketika kita memanggil f(5) tetapi mengembalikan kesalahan ketika kita mencoba mencetak nilai y. Variabel y tidak ada dalam lingkungan global.

Terakhir, R menggunakan definisi variabel terbaru untuk dimasukkan ke dalam badan fungsi. Mari kita perhatikan contoh berikut:

Pelingkupan Lingkungan

R mengabaikan nilai y yang didefinisikan di luar fungsi karena kita secara eksplisit membuat variabel ay di dalam badan fungsi.

Fungsi multi argumen

Kita dapat menulis suatu fungsi dengan lebih dari satu argumen. Pertimbangkan fungsi yang disebut “kali”. Ini adalah fungsi langsung yang mengalikan dua variabel.

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

Keluaran:

## [1] 8

Kapan kita harus menulis fungsi?

Ilmuwan data perlu melakukan banyak tugas yang berulang. Seringkali, kami menyalin dan menempelkan potongan kode secara berulang-ulang. Misalnya, normalisasi suatu variabel sangat disarankan sebelum kita menjalankan a Mesin belajar algoritma. Rumus untuk menormalkan suatu variabel adalah:

Rumus untuk Menormalkan Variabel

Kita sudah mengetahui cara menggunakan fungsi min() dan max() di R. Kita menggunakan perpustakaan tibble untuk membuat bingkai data. Tibble sejauh ini merupakan fungsi yang paling nyaman untuk membuat kumpulan data dari awal.

library(tibble)
# Create a data frame
data_frame <- tibble(  
  c1 = rnorm(50, 5, 1.5), 
  c2 = rnorm(50, 5, 1.5),    
  c3 = rnorm(50, 5, 1.5),    
)

Kami akan melanjutkan dalam dua langkah untuk menghitung fungsi yang dijelaskan di atas. Pada langkah pertama, kita akan membuat variabel bernama c1_norm yang merupakan penskalaan ulang dari c1. Pada langkah kedua, kita tinggal copy paste kode c1_norm dan ganti dengan c2 dan c3.

Detail fungsi dengan kolom c1:

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

Penyebut: maks(data_frame$c1)-min(data_frame$c1))

Oleh karena itu, kita dapat membaginya untuk mendapatkan nilai normalisasi kolom c1:

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

Kita dapat membuat c1_norm, c2_norm dan c3_norm:

Create c1_norm: rescaling of c1		
data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
# show the first five values
head(data_frame$c1_norm, 5)

Keluaran:

## [1] 0.3400113 0.4198788 0.8524394 0.4925860 0.5067991

Berhasil. Kita bisa menyalin dan menempel

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

lalu ubah c1_norm menjadi c2_norm dan c1 menjadi c2. Kami melakukan hal yang sama untuk membuat c3_norm

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

Kami dengan sempurna mengubah skala variabel c1, c2 dan c3.

Namun cara ini rawan kesalahan. Kita bisa saja menyalin dan lupa mengganti nama kolom setelah menempel. Oleh karena itu, praktik yang baik adalah menulis fungsi setiap kali Anda perlu menempelkan kode yang sama lebih dari dua kali. Kita dapat mengatur ulang kode tersebut menjadi rumus dan memanggilnya kapan pun diperlukan. Untuk menulis fungsi kita sendiri, kita perlu memberikan:

  • Nama: normalisasi.
  • jumlah argumen: Kita hanya memerlukan satu argumen, yaitu kolom yang kita gunakan dalam perhitungan.
  • Badan: ini hanyalah rumus yang ingin kita kembalikan.

Kami akan melanjutkan langkah demi langkah untuk membuat fungsi normalisasi.

Langkah 1) Kami membuat pencalonan, yang . Di R, kita dapat menyimpan nominator dalam variabel seperti ini:

nominator <- x-min(x)

Langkah 2) Kami menghitung penyebut: . Kita dapat mereplikasi ide langkah 1 dan menyimpan perhitungannya dalam sebuah variabel:

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

Langkah 3) Kami melakukan pembagian antara penyebut dan penyebut.

normalize <- nominator/denominator

Langkah 4) Untuk mengembalikan nilai ke fungsi pemanggil, kita perlu memasukkan normalisasi ke dalam return() untuk mendapatkan output dari fungsi tersebut.

return(normalize)

Langkah 5) Kami siap menggunakan fungsi tersebut dengan membungkus semua yang ada di dalam braket.

normalize <- function(x){
  # step 1: create the nominator
  nominator <- x-min(x)
  # step 2: create the denominator
  denominator <- max(x)-min(x)
  # step 3: divide nominator by denominator
  normalize <- nominator/denominator
  # return the value
  return(normalize)
}

Mari kita uji fungsi kita dengan variabel c1:

normalize(data_frame$c1)

Ini bekerja dengan sempurna. Kami membuat fungsi pertama kami.

Fungsi adalah cara yang lebih komprehensif untuk melakukan tugas yang berulang. Kita dapat menggunakan rumus normalisasi pada kolom yang berbeda, seperti di bawah ini:

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)

Meskipun contohnya sederhana, kita dapat menyimpulkan kehebatan suatu rumus. Kode di atas lebih mudah dibaca dan terutama menghindari kesalahan saat menempelkan kode.

Fungsi dengan kondisi

Terkadang, kita perlu memasukkan kondisi ke dalam fungsi agar kode dapat menghasilkan keluaran yang berbeda.

Dalam tugas Machine Learning, kita perlu membagi kumpulan data antara kumpulan pelatihan dan kumpulan pengujian. Kumpulan kereta memungkinkan algoritme untuk belajar dari data. Untuk menguji performa model, kita dapat menggunakan set pengujian untuk mengembalikan ukuran performa. R tidak memiliki fungsi untuk membuat dua dataset. Kita dapat menulis fungsi kita sendiri untuk melakukan itu. Fungsi kita mengambil dua argumen dan disebut split_data(). Ide di baliknya sederhana, kita mengalikan panjang kumpulan data (yaitu jumlah observasi) dengan 0.8. Misalnya, jika kita ingin membagi dataset 80/20, dan dataset kita berisi 100 baris, maka fungsi kita akan mengalikan 0.8*100 = 80. 80 baris akan dipilih untuk menjadi data pelatihan kita.

Kami akan menggunakan kumpulan data kualitas udara untuk menguji fungsi yang ditentukan pengguna. Kumpulan data kualitas udara memiliki 153 baris. Kita bisa melihatnya dengan kode di bawah ini:

nrow(airquality)

Keluaran:

## [1] 153

Kami akan melanjutkan sebagai berikut:

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

Fungsi kita memiliki dua argumen. Argumen train adalah parameter Boolean. Jika diatur ke TRUE, fungsi kita membuat dataset train, jika tidak, fungsi kita membuat dataset test.

Kita dapat melanjutkan seperti yang kita lakukan pada fungsi normalise(). Kami menulis kode seolah-olah itu hanya kode satu kali dan kemudian menggabungkan semuanya dengan kondisi ke dalam badan untuk membuat fungsi.

Langkah 1:

Kita perlu menghitung panjang kumpulan data. Hal ini dilakukan dengan fungsi sekarang(). Sekarang mengembalikan jumlah total baris dalam kumpulan data. Kami menyebutnya panjang variabel.

length<- nrow(airquality)
length

Keluaran:

## [1] 153

Langkah 2:

Kami mengalikan panjangnya dengan 0.8. Ini akan mengembalikan jumlah baris yang akan dipilih. Seharusnya 153*0.8 = 122.4

total_row <- length*0.8
total_row

Keluaran:

## [1] 122.4

Kami ingin memilih 122 baris di antara 153 baris dalam kumpulan data kualitas udara. Kami membuat daftar yang berisi nilai dari 1 hingga total_row. Kami menyimpan hasilnya dalam variabel yang disebut split

split <- 1:total_row
split[1:5]

Keluaran:

## [1] 1 2 3 4 5

split memilih 122 baris pertama dari kumpulan data. Misalnya, kita dapat melihat bahwa pemisahan variabel mengumpulkan nilai 1, 2, 3, 4, 5 dan seterusnya. Nilai-nilai ini akan menjadi indeks ketika kita memilih baris yang akan dikembalikan.

Langkah 3:

Kita perlu memilih baris dalam kumpulan data kualitas udara berdasarkan nilai yang disimpan dalam variabel terpisah. Ini dilakukan seperti ini:

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

Keluaran:

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

Langkah 4:

Kita dapat membuat kumpulan data pengujian dengan menggunakan baris yang tersisa, 123:153. Hal ini dilakukan dengan menggunakan – di depan split.

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

Keluaran:

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

Langkah 5:

Kita dapat menciptakan kondisi di dalam badan fungsi. Ingat, kita memiliki argumen train yang merupakan set Boolean ke TRUE secara default untuk mengembalikan set kereta. Untuk membuat kondisi, kami menggunakan sintaks if:

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

Ini dia, kita bisa menulis fungsinya. Kita hanya perlu mengubah kualitas udara menjadi df karena kita ingin mencoba fungsinya ke mana pun bingkai data, tidak hanya kualitas udara:

split_data <- function(df, train = TRUE){
  length<- nrow(df)
  total_row <- length *0.8
  split <- 1:total_row
  if (train ==TRUE){ 
    train_df <- df[split, ] 
      return(train_df)		
  } else {
    test_df <- df[-split, ] 
      return(test_df)		
  }
}

Mari kita coba fungsi kita pada kumpulan data kualitas udara. kita harus memiliki satu set kereta dengan 122 baris dan satu set pengujian dengan 31 baris.

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

Keluaran:

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

Keluaran:

## [1] 31  6