Apakah Fungsi dalam R?
A fungsi , dalam persekitaran pengaturcaraan, adalah satu set arahan. Pengaturcara membina fungsi untuk mengelakkan mengulangi tugas yang sama, atau mengurangkan kerumitan.
Fungsi semestinya
- ditulis untuk melaksanakan tugas yang ditentukan
- mungkin atau tidak termasuk hujah
- mengandungi badan
- mungkin atau tidak akan mengembalikan satu atau lebih nilai.
Pendekatan umum untuk fungsi adalah menggunakan bahagian argumen sebagai input , memberi makan bahagian badan dan akhirnya mengembalikan output . Sintaks fungsi adalah seperti berikut:
function (arglist) {#Function body}
Dalam tutorial ini, kita akan belajar
- R fungsi terbina dalam yang penting
- Fungsi am
- Fungsi matematik
- Fungsi statistik
- Fungsi tulis dalam R
- Bilakah kita mesti menulis fungsi?
- Berfungsi dengan keadaan
R fungsi terbina dalam yang penting
Terdapat banyak fungsi built-in dalam R. R yang memadankan parameter input anda dengan argumen fungsinya, baik berdasarkan nilai atau kedudukan, kemudian jalankan fungsi fungsi. Argumen fungsi boleh mempunyai nilai lalai: jika anda tidak menentukan argumen ini, R akan mengambil nilai lalai.
Catatan : Adalah mungkin untuk melihat kod sumber fungsi dengan menjalankan nama fungsi itu sendiri di konsol.
Kita akan melihat tiga kumpulan fungsi dalam tindakan
- Fungsi am
- Fungsi Matematik
- Fungsi statistik
Fungsi am
Kita sudah biasa dengan fungsi umum seperti fungsi cbind (), rbind (), range (), sort (), order (). Setiap fungsi ini memiliki tugas tertentu, mengambil argumen untuk mengembalikan output. Berikut adalah fungsi penting yang mesti diketahui oleh seseorang-
fungsi diff ()
Sekiranya anda menggunakan siri masa , anda perlu menghentikan siri dengan mengambil nilai ketinggiannya . A proses pegun membolehkan min berterusan, varians dan autokorelasi masa ke masa. Ini terutamanya meningkatkan ramalan siri masa. Ia dapat dilakukan dengan mudah dengan fungsi diff (). Kita dapat membina data siri masa secara rawak dengan tren dan kemudian menggunakan fungsi diff () untuk menghentikan siri. Fungsi diff () menerima satu argumen, vektor, dan mengembalikan perbezaan ketinggalan dan lelaran yang sesuai.
Catatan : Kita sering perlu membuat data rawak, tetapi untuk pembelajaran dan perbandingan, kita mahu nombornya serupa di seluruh mesin. Untuk memastikan kita semua menghasilkan data yang sama, kita menggunakan fungsi set.seed () dengan nilai sewenang-wenang 123. Fungsi set.seed () dihasilkan melalui proses penjana nombor pseudorandom yang menjadikan setiap komputer moden mempunyai urutan yang sama nombor. Sekiranya kita tidak menggunakan fungsi set.seed (), kita semua akan mempunyai urutan nombor yang berbeza.
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),)
panjang () fungsi
Dalam banyak kes, kami ingin mengetahui panjang vektor untuk pengiraan atau digunakan dalam gelung untuk. Fungsi panjang () mengira bilangan baris dalam vektor x. Kod berikut mengimport set data kereta dan mengembalikan bilangan baris.
Catatan : panjang () mengembalikan bilangan elemen dalam vektor. Sekiranya fungsi diteruskan ke dalam matriks atau kerangka data, jumlah lajur dikembalikan.
dt <- cars## number columnslength(dt)
Pengeluaran:
## [1] 1
## number rowslength(dt[,1])
Pengeluaran:
## [1] 50
Fungsi matematik
R mempunyai pelbagai fungsi matematik.
Pengendali | Penerangan |
---|---|
abs (x) | Mengambil nilai mutlak x |
log (x, asas = y) | Mengambil logaritma x dengan asas y; jika asas tidak ditentukan, mengembalikan logaritma semula jadi |
luput (x) | Mengembalikan eksponen x |
sqrt (x) | Mengembalikan punca kuasa dua x |
faktorial (x) | Mengembalikan faktorial x (x!) |
# sequence of number from 44 to 55 both including incremented by 1x_vector <- seq(45,55, by = 1)#logarithmlog(x_vector)
Pengeluaran:
## [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)
Pengeluaran:
## [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)
Pengeluaran:
## [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
Pemasangan standard R mengandungi pelbagai fungsi statistik. Dalam tutorial ini, kita akan melihat secara ringkas fungsi yang paling penting…
Fungsi statistik asas
Pengendali |
Penerangan |
---|---|
bermaksud (x) |
Purata x |
median (x) |
Median x |
var (x) |
Varians x |
sd (x) |
Sisihan piawai x |
skala (x) |
Skor piawai (skor-z) x |
kuantil (x) |
Kuartil x |
ringkasan (x) |
Ringkasan x: min, min, max dll ... |
speed <- dt$speedspeed# Mean speed of cars datasetmean(speed)
Pengeluaran:
## [1] 15.4
# Median speed of cars datasetmedian(speed)
Pengeluaran:
## [1] 15
# Variance speed of cars datasetvar(speed)
Pengeluaran:
## [1] 27.95918
# Standard deviation speed of cars datasetsd(speed)
Pengeluaran:
## [1] 5.287644
# Standardize vector speed of cars datasethead(scale(speed), 5)
Pengeluaran:
## [,1]## [1,] -2.155969## [2,] -2.155969## [3,] -1.588609## [4,] -1.588609## [5,] -1.399489
# Quantile speed of cars datasetquantile(speed)
Pengeluaran:
## 0% 25% 50% 75% 100%## 4 12 15 19 25
# Summary speed of cars datasetsummary(speed)
Pengeluaran:
## Min. 1st Qu. Median Mean 3rd Qu. Max.## 4.0 12.0 15.0 15.4 19.0 25.0
Hingga tahap ini, kami telah mempelajari banyak fungsi terbina dalam R.
Catatan : Berhati-hati dengan kelas argumen, seperti angka, Boolean atau rentetan. Sebagai contoh, jika kita perlu memberikan nilai rentetan, kita harus memasukkan string dalam tanda petik: "ABC".
Fungsi tulis dalam R
Dalam beberapa kesempatan, kita perlu menulis fungsi kita sendiri kerana kita harus menyelesaikan tugas tertentu dan tidak ada fungsi siap pakai. Fungsi yang ditentukan pengguna melibatkan nama , argumen dan isi badan .
function.name <- function(arguments){computations on the argumentssome other code}
Catatan : Amalan yang baik adalah menamakan fungsi yang ditentukan pengguna yang berbeza dengan fungsi terbina dalam. Ia mengelakkan kekeliruan.
Fungsi satu hujah
Dalam coretan seterusnya, kami menentukan fungsi segiempat sederhana. Fungsi menerima nilai dan mengembalikan kuadrat nilai.
square_function<- function(n){# compute the square of integer `n`n^2}# calling the function and passing value 4square_function(4)
Penjelasan Kod:
- Fungsi tersebut dinamakan square_function; ia boleh dipanggil apa sahaja yang kita mahukan.
- Ia menerima hujah "n". Kami tidak menentukan jenis pemboleh ubah sehingga pengguna dapat meneruskan bilangan bulat, vektor atau matriks
- Fungsi mengambil input "n" dan mengembalikan kuadrat input.
Apabila anda selesai menggunakan fungsi, kita dapat menghapusnya dengan fungsi rm ().
# setelah anda membuat fungsi
rm(square_function)square_function
Di konsol, kita dapat melihat mesej ralat: Ralat: objek 'square_function' tidak dijumpai memberitahu bahawa fungsi tidak wujud.
Pemarkahan Alam Sekitar
Di R, lingkungan adalah kumpulan objek seperti fungsi, pemboleh ubah, kerangka data, dll.
R membuka persekitaran setiap kali Rstudio diminta.
Persekitaran tingkat atas yang tersedia adalah persekitaran global , yang disebut R_GlobalEnv. Dan kita mempunyai persekitaran tempatan.
Kita boleh menyenaraikan kandungan persekitaran semasa.
ls(environment())
Pengeluaran
## [1] "diff_ts" "dt" "speed" "square_function"## [5] "ts" "x" "x_vector"
Anda dapat melihat semua pemboleh ubah dan fungsi yang dibuat dalam R_GlobalEnv.
Senarai di atas akan berbeza bagi anda berdasarkan kod bersejarah yang anda laksanakan di R Studio.
Perhatikan bahawa n, argumen fungsi square_function tidak terdapat dalam persekitaran global ini .
Persekitaran baru dibuat untuk setiap fungsi. Dalam contoh di atas, fungsi square_function () mencipta persekitaran baru di dalam persekitaran global.
Untuk menjelaskan perbezaan antara persekitaran global dan tempatan , mari kita teliti contoh berikut
Fungsi ini mengambil nilai x sebagai argumen dan menambahkannya untuk menentukan di luar dan di dalam fungsi
Fungsi mengembalikan output 15. Ini kerana y didefinisikan dalam persekitaran global. Segala pemboleh ubah yang ditentukan dalam persekitaran global boleh digunakan secara tempatan. Pemboleh ubah y mempunyai nilai 10 selama semua panggilan fungsi dan boleh diakses pada bila-bila masa.
Mari lihat apa yang berlaku sekiranya pemboleh ubah y ditentukan dalam fungsi.
Kita perlu menjatuhkan `y` sebelum menjalankan kod ini menggunakan rm r
Keluarannya juga 15 ketika kita memanggil f (5) tetapi mengembalikan ralat ketika kita mencetak nilai y. Pemboleh ubah y tidak berada dalam persekitaran global.
Akhirnya, R menggunakan definisi pemboleh ubah terbaru untuk masuk ke dalam badan fungsi. Mari pertimbangkan contoh berikut:
R mengabaikan nilai-nilai y yang ditentukan di luar fungsi kerana kita secara eksplisit membuat pemboleh ubah di dalam badan fungsi.
Fungsi pelbagai argumen
Kita boleh menulis fungsi dengan lebih daripada satu argumen. Pertimbangkan fungsi yang disebut "kali". Ini adalah fungsi langsung yang mengalikan dua pemboleh ubah.
times <- function(x,y) {x*y}times(2,4)
Pengeluaran:
## [1] 8
Bilakah kita mesti menulis fungsi?
Saintis data perlu melakukan banyak tugas berulang. Selalunya, kami menyalin dan menampal potongan kod secara berulang-ulang. Sebagai contoh, normalisasi pemboleh ubah sangat disarankan sebelum kita menjalankan algoritma pembelajaran mesin. Formula untuk menormalkan pemboleh ubah adalah:
Kami sudah tahu bagaimana menggunakan fungsi min () dan max () di R. Kami menggunakan perpustakaan tibble untuk membuat kerangka data. Tibble sejauh ini merupakan fungsi paling mudah untuk membuat set 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 meneruskan dua langkah untuk mengira fungsi yang dinyatakan di atas. Pada langkah pertama, kita akan membuat pemboleh ubah yang disebut c1_norm yang merupakan penyingkiran semula c1. Pada langkah kedua, kami hanya menyalin dan menampal kod c1_norm dan menukarnya dengan c2 dan c3.
Perincian fungsi dengan lajur c1:
Nominator:: data_frame $ c1 -min (data_frame $ c1))
Penyebut: max (data_frame $ c1) -min (data_frame $ c1))
Oleh itu, kita boleh membahagikannya untuk mendapatkan nilai normal lajur c1:
(data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
Kita boleh 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)
Pengeluaran:
## [1] 0.3400113 0.4198788 0.8524394 0.4925860 0.5067991
Ianya berfungsi. Kami boleh menyalin dan menampal
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 ke c2. Kami melakukan perkara 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 semula pemboleh ubah c1, c2 dan c3 dengan sempurna.
Walau bagaimanapun, kaedah ini terdedah kepada kesilapan. Kami boleh menyalin dan lupa menukar nama lajur setelah ditampal. Oleh itu, amalan yang baik adalah menulis fungsi setiap kali anda perlu menampal kod yang sama lebih dari dua kali. Kami dapat menyusun semula kod menjadi formula dan memanggilnya kapan pun diperlukan. Untuk menulis fungsi kita sendiri, kita perlu memberikan:
- Nama: menormalkan.
- bilangan argumen: Kami hanya memerlukan satu argumen, iaitu lajur yang kami gunakan dalam pengiraan kami.
- Badan: ini hanyalah formula yang ingin kita kembalikan.
Kami akan meneruskan langkah demi langkah untuk membuat fungsi menormalkan.
Langkah 1) Kami membuat nominator , iaitu. Di R, kita dapat menyimpan nominator dalam pemboleh ubah seperti ini:
nominator <- x-min(x)
Langkah 2) Kami mengira penyebut: . Kita dapat meniru idea langkah 1 dan menyimpan pengiraan dalam pemboleh ubah:
denominator <- max(x)-min(x)
Langkah 3) Kami melakukan pembahagian antara penama dan penyebut.
normalize <- nominator/denominator
Langkah 4) Untuk mengembalikan nilai ke fungsi panggilan, kita perlu lulus normalisasi dalam kembali () untuk mendapatkan output fungsi.
return(normalize)
Langkah 5) Kami bersedia menggunakan fungsi dengan membungkus semua yang ada di dalam pendakap.
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 pemboleh ubah c1:
normalize(data_frame$c1)
Ia berfungsi dengan sempurna. Kami membuat fungsi pertama kami.
Fungsi adalah cara yang lebih komprehensif untuk melakukan tugas berulang. Kita boleh menggunakan formula menormalkan pada lajur yang berbeza, seperti di bawah:
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)
Walaupun contohnya mudah, kita dapat menyimpulkan kekuatan formula. Kod di atas lebih senang dibaca dan terutamanya mengelakkan kesilapan semasa menampal kod.
Berfungsi dengan keadaan
Kadang kala, kita perlu memasukkan syarat ke dalam fungsi untuk membolehkan kod mengembalikan output yang berbeza.
Dalam tugas Mesin Belajar, kita perlu membagi set data antara set kereta api dan set ujian. Set kereta api membolehkan algoritma belajar dari data. Untuk menguji prestasi model kami, kami dapat menggunakan set ujian untuk mengembalikan ukuran prestasi. R tidak mempunyai fungsi untuk membuat dua set data. Kita boleh menulis fungsi kita sendiri untuk melakukannya. Fungsi kami mengambil dua argumen dan disebut split_data (). Idea di belakang adalah mudah, kami mengalikan panjang set data (iaitu jumlah pemerhatian) dengan 0.8. Sebagai contoh, jika kita ingin membagi set data 80/20, dan set data kita mengandungi 100 baris, maka fungsi kita akan berlipat ganda 0,8 * 100 = 80. 80 baris akan dipilih untuk menjadi data latihan kita.
Kami akan menggunakan set data airquality untuk menguji fungsi yang ditentukan pengguna. Set data jarak udara mempunyai 153 baris. Kita dapat melihatnya dengan kod di bawah:
nrow(airquality)
Pengeluaran:
## [1] 153
Kami akan meneruskan seperti 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 mempunyai dua hujah. Train argumen adalah parameter Boolean. Sekiranya diatur ke BENAR, fungsi kita membuat set data kereta api, jika tidak, ia membuat set data ujian.
Kita boleh meneruskan seperti fungsi normalisasi (). Kami menulis kod itu seolah-olah hanya kod satu kali dan kemudian membungkus semuanya dengan keadaan ke dalam badan untuk membuat fungsi.
Langkah 1:
Kita perlu mengira panjang dataset. Ini dilakukan dengan fungsi nrow (). Nrow mengembalikan jumlah baris dalam set data. Kami memanggil panjang berubah.
length<- nrow(airquality)length
Pengeluaran:
## [1] 153
Langkah 2:
Kami mengalikan panjang dengan 0.8. Ia akan mengembalikan bilangan baris untuk dipilih. Ia mestilah 153 * 0.8 = 122.4
total_row <- length*0.8total_row
Pengeluaran:
## [1] 122.4
Kami mahu memilih 122 baris di antara 153 baris dalam set data airquality. Kami membuat senarai yang mengandungi nilai dari 1 hingga total_row. Kami menyimpan hasilnya dalam pemboleh ubah yang disebut split
split <- 1:total_rowsplit[1:5]
Pengeluaran:
## [1] 1 2 3 4 5
split memilih 122 baris pertama dari set data. Sebagai contoh, kita dapat melihat bahawa pembahagian pemboleh ubah kita mengumpulkan nilai 1, 2, 3, 4, 5 dan seterusnya. Nilai-nilai ini akan menjadi indeks ketika kita akan memilih baris untuk dikembalikan.
Langkah 3:
Kita perlu memilih baris dalam kumpulan data airquality berdasarkan nilai-nilai yang tersimpan dalam pemboleh ubah split. Ini dilakukan seperti ini:
train_df <- airquality[split, ]head(train_df)
Pengeluaran:
##[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 boleh membuat set data ujian dengan menggunakan baris yang tersisa, 123: 153. Ini dilakukan dengan menggunakan - di hadapan perpecahan.
test_df <- airquality[-split, ]head(test_df)
Pengeluaran:
##[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 mewujudkan keadaan di dalam badan fungsi. Ingat, kami mempunyai kereta api argumen yang merupakan set Boolean menjadi BENAR secara lalai untuk mengembalikan set kereta api. Untuk membuat keadaan, kami menggunakan sintaks if:
if (train ==TRUE){train_df <- airquality[split, ]return(train)} else {test_df <- airquality[-split, ]return(test)}
Ini dia, kita boleh tulis fungsinya. Kita hanya perlu mengubah kualiti udara menjadi df kerana kita ingin mencuba fungsi kita ke kerangka data apa pun, bukan hanya kualiti udara:
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 cuba fungsi kami pada set data airquality. kita harus mempunyai satu set kereta api dengan 122 baris dan satu set ujian dengan 31 baris.
train <- split_data(airquality, train = TRUE)dim(train)
Pengeluaran:
## [1] 122 6
test <- split_data(airquality, train = FALSE)dim(test)
Pengeluaran:
## [1] 31 6