Apa Fungsi di R?
Suatu fungsi , dalam lingkungan pemrograman, adalah sekumpulan instruksi. Seorang programmer membangun sebuah fungsi untuk menghindari pengulangan tugas yang sama, atau mengurangi kompleksitas.
Sebuah fungsi seharusnya
- ditulis untuk melaksanakan tugas tertentu
- mungkin atau mungkin tidak termasuk argumen
- mengandung tubuh
- mungkin atau mungkin tidak mengembalikan satu atau lebih nilai.
Pendekatan umum untuk suatu fungsi adalah dengan menggunakan bagian argumen sebagai masukan , memberi makan bagian tubuh, dan akhirnya mengembalikan keluaran . Sintaks suatu fungsi adalah sebagai berikut:
function (arglist) {#Function body}
Dalam tutorial ini, kita akan belajar
- R fungsi bawaan yang penting
- Fungsi umum
- Fungsi matematika
- Fungsi statistik
- Menulis fungsi di R
- Kapan kita harus menulis fungsi?
- Berfungsi dengan kondisi
R fungsi bawaan yang penting
Ada banyak fungsi built-in di R. R mencocokkan parameter input Anda dengan argumen fungsinya, baik berdasarkan nilai atau posisi, lalu mengeksekusi badan fungsi. Argumen fungsi dapat memiliki nilai default: jika Anda tidak menentukan argumen ini, R akan mengambil nilai default.
Catatan : Anda dapat melihat kode sumber suatu fungsi dengan menjalankan nama fungsi itu sendiri di konsol.
Kita akan melihat tiga kelompok fungsi beraksi
- Fungsi umum
- Fungsi matematika
- Fungsi statistik
Fungsi umum
Kita sudah familiar dengan fungsi umum seperti fungsi cbind (), rbind (), range (), sort (), order (). Masing-masing fungsi ini memiliki tugas tertentu, membutuhkan argumen untuk mengembalikan keluaran. Berikut adalah fungsi penting yang harus diketahui:
diff () fungsi
Jika Anda bekerja pada deret waktu , Anda perlu stasionerkan deret dengan mengambil nilai jeda mereka . Sebuah proses stasioner memungkinkan rata-rata yang konstan, varians dan autokorelasi dari waktu ke waktu. Ini terutama meningkatkan prediksi deret waktu. Ini dapat dengan mudah dilakukan dengan fungsi diff (). Kita bisa membangun data deret waktu acak dengan tren dan kemudian menggunakan fungsi diff () untuk stasionerkan deret tersebut. Fungsi diff () menerima satu argumen, vektor, dan mengembalikan perbedaan lag dan iterasi yang sesuai.
Catatan : Kami sering kali perlu membuat data acak, tetapi untuk pembelajaran dan perbandingan kami ingin angkanya identik di seluruh mesin. Untuk memastikan kita semua menghasilkan data yang sama, kita menggunakan fungsi set.seed () dengan nilai arbitrer 123. Fungsi set.seed () dihasilkan melalui proses pembuat nomor pseudorandom yang membuat setiap komputer modern memiliki urutan yang sama angka. Jika kita tidak menggunakan fungsi set.seed (), kita semua akan memiliki urutan angka yang berbeda.
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),)
fungsi panjang ()
Dalam banyak kasus, kita ingin mengetahui panjang vektor untuk komputasi atau yang akan digunakan dalam perulangan for. Fungsi length () menghitung jumlah baris dalam vektor x. Kode berikut mengimpor dataset mobil dan mengembalikan jumlah baris.
Catatan : length () mengembalikan jumlah elemen dalam vektor. Jika fungsi dilewatkan ke matriks atau bingkai data, jumlah kolom dikembalikan.
dt <- cars## number columnslength(dt)
Keluaran:
## [1] 1
## number rowslength(dt[,1])
Keluaran:
## [1] 50
Fungsi matematika
R memiliki berbagai fungsi matematika.
Operator | Deskripsi |
---|---|
abs (x) | Mengambil nilai absolut 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 1x_vector <- seq(45,55, by = 1)#logarithmlog(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
#exponentialexp(x_vector)
#squared rootsqrt(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
#factorialfactorial(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 |
Deskripsi |
---|---|
rata-rata (x) |
Rata-rata x |
median (x) |
Median x |
var (x) |
Variansi x |
sd (x) |
Simpangan baku x |
skala (x) |
Skor standar (skor-z) dari x |
kuantil (x) |
Kuartil dari x |
ringkasan (x) |
Ringkasan x: mean, min, max dll… |
speed <- dt$speedspeed# Mean speed of cars datasetmean(speed)
Keluaran:
## [1] 15.4
# Median speed of cars datasetmedian(speed)
Keluaran:
## [1] 15
# Variance speed of cars datasetvar(speed)
Keluaran:
## [1] 27.95918
# Standard deviation speed of cars datasetsd(speed)
Keluaran:
## [1] 5.287644
# Standardize vector speed of cars datasethead(scale(speed), 5)
Keluaran:
## [,1]## [1,] -2.155969## [2,] -2.155969## [3,] -1.588609## [4,] -1.588609## [5,] -1.399489
# Quantile speed of cars datasetquantile(speed)
Keluaran:
## 0% 25% 50% 75% 100%## 4 12 15 19 25
# Summary speed of cars datasetsummary(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, kami telah mempelajari banyak fungsi built-in R.
Catatan : Berhati-hatilah dengan kelas argumennya, misalnya numerik, Boolean, atau string. Misalnya, jika kita perlu mengirimkan nilai string, kita perlu menyertakan string dalam tanda kutip: "ABC".
Menulis fungsi di R
Dalam beberapa kesempatan, kita perlu menulis fungsi kita sendiri karena kita harus menyelesaikan tugas tertentu dan tidak ada fungsi siap pakai. Fungsi yang ditentukan pengguna melibatkan nama , argumen , dan isi .
function.name <- function(arguments){computations on the argumentssome other code}
Catatan : Praktik yang baik adalah memberi nama fungsi yang ditentukan pengguna berbeda dari fungsi bawaan. Ini menghindari kebingungan.
Satu fungsi argumen
Dalam potongan berikutnya, kami mendefinisikan fungsi persegi sederhana. Fungsi tersebut menerima nilai dan mengembalikan kuadrat dari nilai tersebut.
square_function<- function(n){# compute the square of integer `n`n^2}# calling the function and passing value 4square_function(4)
Penjelasan Kode:
- Fungsi tersebut bernama square_function; bisa disebut apapun yang kita mau.
- Ini menerima argumen "n". Kami tidak menentukan jenis variabel sehingga pengguna dapat mengirimkan bilangan bulat, vektor, atau matriks
- Fungsi ini mengambil masukan "n" dan mengembalikan kuadrat dari masukan tersebut.
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: Kesalahan: objek 'square_function' tidak ditemukan memberi tahu fungsi tidak ada.
Lingkup Lingkungan
Di R, lingkungan adalah kumpulan objek seperti fungsi, variabel, bingkai data, dll.
R membuka lingkungan setiap kali Rstudio diminta.
Lingkungan level teratas yang tersedia adalah lingkungan global , yang disebut R_GlobalEnv. Dan kami memiliki lingkungan lokal.
Kami 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 tidak ada di lingkungan global ini .
Lingkungan baru dibuat untuk setiap fungsi. Dalam contoh di atas, fungsi square_function () membuat lingkungan baru di dalam lingkungan global.
Untuk memperjelas perbedaan antara lingkungan global dan lokal , mari pelajari contoh berikut
Fungsi ini mengambil nilai x sebagai argumen dan menambahkannya ke y mendefinisikan di luar dan di dalam fungsi
Fungsi f mengembalikan output 15. 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 menghapus `y` sebelum menjalankan kode ini menggunakan rm r
Outputnya juga 15 ketika kita memanggil f (5) tetapi mengembalikan kesalahan ketika kita mencoba mencetak nilai y. Variabel y tidak ada di lingkungan global.
Akhirnya, R menggunakan definisi variabel terbaru untuk diteruskan ke dalam tubuh suatu fungsi. Mari pertimbangkan contoh berikut:
R mengabaikan nilai y yang didefinisikan di luar fungsi karena kita secara eksplisit membuat variabel ay di dalam tubuh fungsi.
Fungsi multi argumen
Kita dapat menulis sebuah fungsi dengan lebih dari satu argumen. Pertimbangkan fungsi yang disebut "waktu". 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 berulang. Seringkali, kami menyalin dan menempelkan potongan kode secara berulang. Misalnya, normalisasi variabel sangat disarankan sebelum kita menjalankan algoritme pembelajaran mesin. Rumus untuk menormalkan variabel adalah:
Kita sudah tahu bagaimana menggunakan fungsi min () dan max () di R. Kita menggunakan perpustakaan tibble untuk membuat bingkai data. Sejauh ini, Tibble adalah fungsi yang paling nyaman untuk membuat kumpulan data dari awal.
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),)
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 dari c1. Pada langkah kedua, kita cukup copy dan paste kode c1_norm dan ubah dengan c2 dan c3.
Detail fungsi dengan kolom c1:
Nominator:: data_frame $ c1 -min (data_frame $ c1))
Penyebut: max (data_frame $ c1) -min (data_frame $ c1))
Oleh karena itu, kita dapat membaginya untuk mendapatkan nilai kolom c1 yang dinormalisasi:
(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 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)
Keluaran:
## [1] 0.3400113 0.4198788 0.8524394 0.4925860 0.5067991
Berhasil. Kami dapat menyalin dan menempel
data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
kemudian 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 mengubah skala variabel c1, c2 dan c3 dengan sempurna.
Akan tetapi, metode ini rawan kesalahan. Kita bisa menyalin dan lupa mengubah 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. Kami dapat mengatur ulang kode menjadi rumus dan memanggilnya kapan pun diperlukan. Untuk menulis fungsi kita sendiri, kita perlu memberikan:
- Nama: normalisasi.
- jumlah argumen: Kami hanya membutuhkan satu argumen, yaitu kolom yang kami gunakan dalam perhitungan kami.
- Body: ini hanyalah rumus yang ingin kami kembalikan.
Kami akan melanjutkan langkah demi langkah untuk membuat fungsi normalisasi.
Langkah 1) Kami membuat nominator , yaitu. Di R, kita dapat menyimpan nominator dalam variabel seperti ini:
nominator <- x-min(x)
Langkah 2) Kami menghitung denominator: . Kita dapat mereplikasi gagasan langkah 1 dan menyimpan perhitungan dalam variabel:
denominator <- max(x)-min(x)
Langkah 3) Kami melakukan pembagian antara nominator dan penyebut.
normalize <- nominator/denominator
Langkah 4) Untuk mengembalikan nilai ke fungsi panggilan kita perlu melewati normalize inside 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 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)}
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 kekuatan rumus. Kode di atas lebih mudah dibaca dan terutama menghindari kesalahan saat menempelkan kode.
Berfungsi dengan kondisi
Terkadang, kita perlu memasukkan kondisi ke dalam fungsi untuk memungkinkan kode mengembalikan keluaran yang berbeda.
Dalam tugas Machine Learning, kita perlu membagi set data antara set rangkaian dan set pengujian. Set kereta memungkinkan algoritme untuk belajar dari data. Untuk menguji kinerja model kami, kami dapat menggunakan set pengujian untuk mengembalikan ukuran kinerja. R tidak memiliki fungsi untuk membuat dua dataset. Kita bisa menulis fungsi kita sendiri untuk melakukan itu. Fungsi kita mengambil dua argumen dan disebut split_data (). Ide di baliknya sederhana, kita mengalikan panjang dataset (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 dataset airquality untuk menguji fungsi yang ditentukan pengguna kami. Dataset airquality 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 kami memiliki dua argumen. Kereta argumen adalah parameter Boolean. Jika disetel ke TRUE, fungsi kami membuat kumpulan data train, jika tidak, ini membuat kumpulan data pengujian.
Kita dapat melanjutkan seperti yang kita lakukan pada fungsi normalize (). Kami menulis kode seolah-olah hanya kode satu kali dan kemudian membungkus semuanya dengan kondisi ke dalam tubuh untuk membuat fungsi.
Langkah 1:
Kita perlu menghitung panjang dataset. Ini dilakukan dengan fungsi nrow (). Nrow mengembalikan jumlah 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 untuk dipilih. Ini harus 153 * 0,8 = 122,4
total_row <- length*0.8total_row
Keluaran:
## [1] 122.4
Kami ingin memilih 122 baris di antara 153 baris dalam dataset airquality. Kami membuat daftar yang berisi nilai dari 1 hingga total_row. Kami menyimpan hasilnya dalam variabel yang disebut split
split <- 1:total_rowsplit[1:5]
Keluaran:
## [1] 1 2 3 4 5
split memilih 122 baris pertama dari kumpulan data. Misalnya, kita dapat melihat bahwa pembagian variabel kita mengumpulkan nilai 1, 2, 3, 4, 5, dan seterusnya. Nilai-nilai ini akan menjadi indeks ketika kita akan memilih baris yang akan dikembalikan.
Langkah 3:
Kita perlu memilih baris dalam dataset airquality berdasarkan nilai yang disimpan dalam variabel split. 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 set data uji dengan menggunakan baris yang tersisa, 123: 153. 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 bisa menciptakan kondisi di dalam tubuh fungsi tersebut. Ingat, kami memiliki rangkaian argumen yang merupakan set Boolean ke TRUE secara default untuk mengembalikan set rangkaian. Untuk membuat kondisi tersebut, 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 airquality ke df karena kita ingin mencoba fungsi kita ke data frame apa saja, tidak hanya airquality:
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)}}
Mari coba fungsi kita pada dataset airquality. 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