Tip dan trik praktis

Sebagian besar dari kita biasanya lebih suka bekerja dalam satu bahasa, baik itu R atau python, namun terkadang kita mungkin harus beralih ke bahasa lain mungkin karena alasan seperti kebutuhan proyek, ketersediaan paket tertentu, dan kepentingan pribadi. Oleh karena itu, saya menulis seri ini untuk seseorang yang sudah terbiasa melakukan ilmu data dengan python tetapi ingin mempelajari R. Saya akan mulai dengan dasar-dasarnya dan membahas topik-topik berikut di artikel ini.

  • Struktur data
  • Sub-pengaturan
  • Struktur kendali
  • Fungsi
  • Vektorisasi

Struktur Data-

R memiliki 6 kelas atom termasuk -karakter, numerik (nyata atau desimal), bilangan bulat, dan logis, yang cukup jelas dari namanya. Mari kita lihat beberapa struktur data di R.

vektor

Vektor adalah struktur data paling umum dan mendasar di R dan merupakan pekerja keras R. Secara teknis, vektor dapat berupa salah satu dari dua jenis:

  • Vektor atom- Ini mirip dengan array numpy satu dimensi di python. Mereka dapat menyimpan nilai numerik, karakter, atau logika. Dalam vektor atom, semua elemen dalam vektor mempunyai tipe data yang sama.
  • Daftar- Ini mirip dengan lists python, dan sama seperti daftar, daftar ini dapat berisi nilai dengan tipe berbeda, dan bahkan daftar lain.

Berikut adalah contoh cara membuat vektor dan daftar atom.

# example of character, numerical, and logical vectors respectively.
name <- c("Mike", "Lucy", "John") 
age <- c(20, 25, 30) 
student <- c(TRUE, FALSE, TRUE)
# example of list
student1 <- list("Mike", 20, TRUE)

Mari kita lihat bagaimana Anda dapat mengkonversi dari vektor ke daftar dan sebaliknya.

# convert vector to list
name_list <- as.list(name)
# convert list to vector
student_vector <- unlist(student1)

Sekarang Anda mungkin bertanya-tanya bahwa saya baru saja mengatakan bahwa vektor tidak dapat menampung lebih dari satu tipe data, namun saya masih dapat mengonversi daftar menjadi vektor. Sebenarnya ketika Anda mengonversi daftar menjadi vektor, semua elemen daftar diubah menjadi satu tipe data. Misalnya. ketika kita mengubah siswa1 menjadi vektor, kita mendapatkan vektor karakter, dengan semua elemen sebagai karakter.

student_vector <- unlist(student1)
student_vector
[1] "Mike" "20"   "TRUE"

Objek turunan-Matriks, Array, dan bingkai Dataadalah objek turunan. Matriks dan bingkai data keduanya merupakan objek data persegi panjang. Perbedaannya adalah bahwa dalam sebuah matriks semuanya harus bertipe data yang sama, namun dalam bingkai data seseorang dapat memiliki tipe data yang berbeda di kolom yang berbeda. Singkatnya, Anda dapat menganggap matriks sebagai vektor atom dua dimensi dan bingkai data sebagai daftar dua dimensi. Array mirip dengan matriks tetapi dapat mempunyai lebih dari dua dimensi. Saya akan membahas topik ini lebih detail di bagian selanjutnya.

Subsetting

Mari kita lihat sekilas Subsetting di R. Ada beberapa perbedaan dari python:-

  • Pengindeksan dimulai dari 1 di R, tidak seperti 0 di python
  • Nilai mulai dan berhenti bersifat inklusif selama pemotongan, tidak seperti python yang nilai berhentinya eksklusif.
  • Nilai awal dan akhir harus ditentukan selama pemotongan, tidak seperti python di mana jika Anda tidak menentukan nilai mulai/berhenti, nilai tersebut akan merujuk ke nilai pertama/terakhir.

Sekarang kita tahu bahwa dengan python, kita juga bisa menggunakan pengindeksan terbalik untuk merujuk ke elemen dari yang terakhir menggunakan operator -. Sayangnya, hal ini tidak mungkin dilakukan di R. Namun, ada beberapa cara agar kita dapat mencapai hasil serupa.

# example of reverse indexing in python
x = list(range(1,11))
# access the last element
x[-1]
# access last 5 elements
x[-5:]

Anda dapat mencapai hal serupa di R sebagai berikut.

x = 1:10
# access the last element
x[length(x)]
# access last 5 elements using following three ways
x[ (length(x) - 4): length(x)]
x[length(x) - (4:0)]  
x[seq.int(to = length(x), length.out = 5)] 

Selanjutnya, Anda juga dapat menggunakan tail untuk mengakses elemen n terakhir seperti yang ditunjukkan di bawah ini. Metode ini tidak hanya lebih mudah dibaca, tetapi juga lebih aman untuk digunakan jika Anda tidak yakin bahwa panjang x akan selalu melebihi n.

# access last 5 elements
tail(x,5)
[1]  6  7  8  9 10
# access last 20 elements
tail(x, 20)
[1] 1 2 3 4 5 6 7 8 9 10

Struktur Kontrol

Mari kita lihat beberapa struktur kontrol dasar: -

if, else:-Berikut adalah kode if, else dengan python.

# code for if, else in python
if condition 1:
    # do something
elif condition 2:
    # do something 
else:
    # do something else

Berikut ini adalah kode if else di R.

# code for if, else in R
if (condition 1) {
  # do something
} else if (condition 2) {
  # do something 
} else 
  # do something else

Meskipun sintaksnya cukup familiar, Anda akan melihat bahwa di R-

  • lekukan kalimat tidak diperlukan, sebagai gantinya, Anda harus menggunakan {} brackets keriting untuk menunjukkan blok kode. Selain itu, perhatikan bahwa jika blok kode berupa satu baris, Anda juga dapat melewatkan tanda kurung kurawal.
  • ketentuan wajib ditulis dalam tanda kurung lengkung ().
  • else ifdigunakan sebagai ganti elif .

Perhatikan juga bahwa pernyataan else if dan else harus dimulai pada baris yang sama dengan tanda kurung kurawal if berakhir.

For loop-Sintaks for loop juga sangat mirip dengan python dan R, ingatlah poin-poin yang saya sebutkan di bagian if, else di atas for. Berikut adalah contoh perulangan for pada python.

for i in range(1,11):
    print(i)

Berikut ini adalah kode yang sesuai di R.

for (i in 1:10) {
    print(i)
}

Beberapa hal yang perlu diingat adalah: -

  • R menggunakan next keyword yang analog dengan continue keyword di python
  • kedua bahasa menggunakan kata kunci break untuk keluar dari lingkaran.

Fungsi

Sekarang kita semua sudah familiar dengan struktur dasar mendeklarasikan suatu fungsi dengan python seperti yang dijelaskan di bawah ini.

def functionName( parameters/arguments ):
   #body of the function
   return [expression]
# this is a sample function in python
def addFunction(x, y):
  z = x + y
  return z

Demikian pula, kita dapat mendefinisikan fungsi di R sebagai berikut-

functionName <- function( parameters/arguments ) {
    #body of the function
    return( expression )
}
# this is a sample function in R
addFunction <- function( x, y){
    z <- x + y
    return (z)
}

Perhatikan bahwa di R tidak perlu menulis return function untuk mengembalikan nilai dari fungsi tersebut. function() sendiri mengembalikan nilai yang terakhir dievaluasi bahkan tanpa menyertakan fungsi return(). Misalnya. seperti yang ditunjukkan pada contoh di bawah ini.

addFunction <- function( x, y){
    z <- x + y
    z
}

Vektorisasi

Kita semua akrab dengan pemahaman daftar dengan python, di mana Anda dapat menulis keseluruhan perulangan for dalam satu kalimat.

# basic syntax of list comprehension
[ expression for item in list if conditional ]
# an example of list comprehension
# construct a range of values
xs = range(1,11)
# filter xs for even values
xs = [x for x in xs if x % 2 == 0]

R juga memiliki cara yang sama elegannya (atau mungkin lebih baik) dalam melakukan hal-hal yang mirip dengan pemahaman daftar melalui vektorizaiton, di mana fungsi yang divektorkan dapat diterapkan ke vektor apa pun. Misalnya. kode di atas dapat diimplementasikan di R sebagai berikut: -

# construct a range of values
xs <- 1:10
# xs == c(1,2,3,4,5,6,7,8,9,10)
# filter xs for even values
x[ ifelse(x %%2 == 0, TRUE, FALSE) ]
# basically vector[ ifelse( condition , yes, no)]

Mari melangkah lebih jauh dan ambil contoh fungsi paste() di R yang hanya digunakan untuk menggabungkan dua string. Namun, ketika Anda meneruskan vektor sebagai argumen fungsi paste(), R akan menerapkan elemen fungsi ini pada vektor dan mengembalikan vektor yang dihasilkan, seperti yang ditunjukkan pada contoh di bawah.

authors <- c("Andrie","Joris")
lastnames <- c("de Vries","Meys")
paste(authors,lastnames)
[1] "Andrie de Vries" "Joris Meys"

Seperti yang Anda lihat pada contoh di atas, R mengambil elemen pertama dari dua vektor dan kemudian menerapkan fungsinya, lalu mengambil elemen kedua dengan cara yang sama dan mengulangi prosesnya. Namun, mari kita lihat apa yang terjadi jika kedua vektor memiliki panjang yang tidak sama pada contoh di bawah.

firstnames <- c("Joris", "Carolien", "Koen")
lastname <- c("Meys")
paste(firstnames,lastname)
[1] "Joris Meys"  "Carolien Meys" "Koen Meys"

Jika vektor-vektor tersebut panjangnya tidak sama, R mengulangi vektor yang lebih kecil sampai setiap elemen dari vektor yang lebih panjang habis. Operasi yang divektorkan selalu menghasilkan vektor yang panjangnya sama dengan vektor yang lebih panjang.

Saya harap Anda menikmati bagian pertama dari seri ini, dan ini akan membantu Anda melakukan transisi lebih cepat dari python ke R. Silakan berkomentar dan mengajukan pertanyaan, atau memberikan beberapa saran. Anda juga dapat membaca beberapa artikel saya yang lain di sini.