Dokumen ini membahas dasar-dasar pemrograman R yang menjadi fondasi penting dalam analisis data statistika. Pembahasan mencakup pengenalan berbagai struktur data utama dalam R, yaitu vektor, list, dan data frame, beserta perbedaan karakteristik dan cara penggunaannya. Selain itu, dokumen ini juga membahas penanganan missing value (NA) mulai dari identifikasi, pencarian posisi, hingga perhitungan jumlah data yang hilang. Melalui eksplorasi ini, pembaca diharapkan mampu memahami cara kerja struktur data di R serta menerapkannya dalam pengolahan data secara sistematis.

Latihan No. 1

Diketahui: Terdapat elemen 5, FALSE, "true", "8.3", "Statistika" yang akan dibuat menjadi sebuah vector.

Ditanya: Ketikkan perintah berikut dan berikan pernyataan yang dapat diperoleh.

Dijawab:

nama_vector <- c(5, FALSE, "true", "8.3", "Statistika")
nama_vector
## [1] "5"          "FALSE"      "true"       "8.3"        "Statistika"

Dari output di atas, dapat diperoleh beberapa pernyataan berikut:

1. Semua elemen berubah menjadi tipe character

Vektor dalam R bersifat atomic, artinya hanya dapat menyimpan satu tipe data. Ketika elemen dengan tipe berbeda dimasukkan sekaligus, R secara otomatis melakukan type coercion atau memaksa semua elemen mengikuti tipe data dengan prioritas tertinggi.

Hierarki prioritas tipe data di R: logical -> integer -> double -> complex -> character

Karena terdapat elemen bertipe character ("true", "8.3", "Statistika"), seluruh elemen dipaksa menjadi character, sehingga:

2. FALSE ≠ “true” secara logika

FALSE tanpa tanda kutip adalah nilai logika bawaan R, sedangkan "true" dengan tanda kutip adalah string biasa. Setelah coercion, keduanya hanya berupa teks biasa.

3. Operasi matematis tidak bisa dilakukan

nama_vector[1] + 1  # Error karena "5" sudah bertipe character
## Error in nama_vector[1] + 1: non-numeric argument to binary operator

Latihan No. 2

Diketahui: Elemen yang digunakan sama dengan Latihan No. 1.

Ditanya: Buat list bernama contoh_list, panggil seluruh elemennya, dan jelaskan perbedaan list dengan vector.

Dijawab:

1. Membuat dan memanggil contoh_list

contoh_list <- list(5, FALSE, "true", "8.3", "Statistika")
contoh_list
## [[1]]
## [1] 5
## 
## [[2]]
## [1] FALSE
## 
## [[3]]
## [1] "true"
## 
## [[4]]
## [1] "8.3"
## 
## [[5]]
## [1] "Statistika"

2. Pemanggilan elemen menggunakan index [[ ]]

contoh_list[[1]]  # elemen pertama
## [1] 5
contoh_list[[2]]  # elemen kedua
## [1] FALSE
contoh_list[[3]]  # elemen ketiga
## [1] "true"
contoh_list[[4]]  # elemen keempat
## [1] "8.3"
contoh_list[[5]]  # elemen kelima
## [1] "Statistika"

3. Verifikasi tipe data tiap elemen

class(contoh_list[[1]])  # numeric
## [1] "numeric"
class(contoh_list[[2]])  # logical
## [1] "logical"
class(contoh_list[[3]])  # character
## [1] "character"

4. Perbedaan List dan Vector

Aspek Vector List
Tipe data Harus sama (satu tipe) Boleh berbeda
Type coercion Ya, otomatis Tidak
Akses elemen vector[1] list[[1]] atau list$nama
Fleksibilitas Terbatas Sangat fleksibel

Kesimpulan: List bersifat heterogen yaitu mampu menyimpan elemen dengan tipe data berbeda tanpa mengubah tipe aslinya. Sebaliknya, vector bersifat homogen yang artinya seluruh elemen dipaksa menjadi satu tipe data mengikuti hierarki prioritas tipe di R.


Latihan No. 3

Diketahui: Akan dibuat sebuah data frame dengan nama kelompok_kkn yang terdiri dari tiga kolom: nama, nim, dan prodi, dengan minimal 10 baris data.

Ditanya:

  1. Buat data frame kelompok_kkn dengan minimal 10 baris
  2. Lakukan eksperimen pemanggilan isi tabel meliputi pemanggilan baris, kolom, dan elemen
  3. Jelaskan perbedaan cara pemanggilan dalam data frame

Dijawab:

1. Membuat Data Frame kelompok_kkn

kelompok_kkn <- data.frame(
  nama  = c("Andi", "Budi", "Citra", "Dewi", "Eka",
            "Fani", "Gita", "Hadi", "Iwan", "Joko"),
  nim   = c("2304010001", "2304030002", "2304070003", "2304010004", "2304090005",
            "2304110006", "2304010007", "2304030008", "2304070009", "2304090010"),
  prodi = c("Statistika", "Matematika", "Fisika", "Statistika", "Kimia",
            "Biologi", "Statistika", "Matematika", "Fisika", "Kimia")
)

kelompok_kkn
##     nama        nim      prodi
## 1   Andi 2304010001 Statistika
## 2   Budi 2304030002 Matematika
## 3  Citra 2304070003     Fisika
## 4   Dewi 2304010004 Statistika
## 5    Eka 2304090005      Kimia
## 6   Fani 2304110006    Biologi
## 7   Gita 2304010007 Statistika
## 8   Hadi 2304030008 Matematika
## 9   Iwan 2304070009     Fisika
## 10  Joko 2304090010      Kimia

2. Eksperimen Pemanggilan Isi Tabel

a. Pemanggilan Baris

kelompok_kkn[1, ]    # memanggil baris ke-1
##   nama        nim      prodi
## 1 Andi 2304010001 Statistika
kelompok_kkn[3, ]    # memanggil baris ke-3
##    nama        nim  prodi
## 3 Citra 2304070003 Fisika
kelompok_kkn[1:5, ]  # memanggil baris ke-1 sampai ke-5
##    nama        nim      prodi
## 1  Andi 2304010001 Statistika
## 2  Budi 2304030002 Matematika
## 3 Citra 2304070003     Fisika
## 4  Dewi 2304010004 Statistika
## 5   Eka 2304090005      Kimia

b. Pemanggilan Kolom

kelompok_kkn[, 1]       # memanggil kolom ke-1 (by index)
##  [1] "Andi"  "Budi"  "Citra" "Dewi"  "Eka"   "Fani"  "Gita"  "Hadi"  "Iwan" 
## [10] "Joko"
kelompok_kkn[, "nama"]  # memanggil kolom nama (by nama kolom)
##  [1] "Andi"  "Budi"  "Citra" "Dewi"  "Eka"   "Fani"  "Gita"  "Hadi"  "Iwan" 
## [10] "Joko"
kelompok_kkn$nim        # memanggil kolom nim (operator $)
##  [1] "2304010001" "2304030002" "2304070003" "2304010004" "2304090005"
##  [6] "2304110006" "2304010007" "2304030008" "2304070009" "2304090010"
kelompok_kkn$prodi      # memanggil kolom prodi (operator $)
##  [1] "Statistika" "Matematika" "Fisika"     "Statistika" "Kimia"     
##  [6] "Biologi"    "Statistika" "Matematika" "Fisika"     "Kimia"

c. Pemanggilan Elemen Spesifik

kelompok_kkn[2, 1]        # elemen baris 2, kolom 1
## [1] "Budi"
kelompok_kkn[5, "prodi"]  # elemen baris 5, kolom prodi
## [1] "Kimia"
kelompok_kkn[3, 3]        # elemen baris 3, kolom 3
## [1] "Fisika"

3. Perbedaan Cara Pemanggilan

Cara Syntax Keterangan
By index baris df[1, ] Kosong setelah koma = semua kolom
By index kolom df[, 1] Kosong sebelum koma = semua baris
By nama kolom df[, "nama"] Lebih mudah dibaca
Operator $ df$nama Paling umum digunakan
Elemen spesifik df[2, 1] Baris dan kolom ditentukan

Kesimpulan: Pemanggilan dengan [ , ] lebih fleksibel karena bisa mengakses baris, kolom, maupun elemen secara bersamaan. Operator $ lebih praktis namun hanya bisa mengakses satu kolom berdasarkan namanya.


Latihan No. 4

Diketahui: Akan dibuat sebuah data frame yang beberapa datanya berupa missing value (NA).

Ditanya:

  1. Buat data frame yang memuat missing value
  2. Cari letak atau posisi data yang berupa missing value menggunakan is.na()

Dijawab:

1. Membuat Data Frame dengan Missing Value

df_na <- data.frame(
  nama  = c("Andi", "Budi", "Citra", "Dewi", "Eka",
            "Fani", "Gita", "Hadi", "Iwan", "Joko"),
  nilai = c(80, NA, 75, NA, 90, 85, NA, 78, 88, NA),
  usia  = c(20, 21, NA, 22, 20, NA, 23, 21, NA, 22)
)

df_na
##     nama nilai usia
## 1   Andi    80   20
## 2   Budi    NA   21
## 3  Citra    75   NA
## 4   Dewi    NA   22
## 5    Eka    90   20
## 6   Fani    85   NA
## 7   Gita    NA   23
## 8   Hadi    78   21
## 9   Iwan    88   NA
## 10  Joko    NA   22

2. Mengecek Keberadaan Missing Value

is.na(df_na)
##        nama nilai  usia
##  [1,] FALSE FALSE FALSE
##  [2,] FALSE  TRUE FALSE
##  [3,] FALSE FALSE  TRUE
##  [4,] FALSE  TRUE FALSE
##  [5,] FALSE FALSE FALSE
##  [6,] FALSE FALSE  TRUE
##  [7,] FALSE  TRUE FALSE
##  [8,] FALSE FALSE FALSE
##  [9,] FALSE FALSE  TRUE
## [10,] FALSE  TRUE FALSE

3. Mencari Posisi Missing Value per Kolom

which(is.na(df_na$nilai))  # posisi NA di baris ke-berapa pada kolom nilai
## [1]  2  4  7 10
which(is.na(df_na$usia))   # posisi NA di baris ke-berapa pada kolom usia
## [1] 3 6 9

4. Menghitung Total Missing Value

sum(is.na(df_na$nilai))  # total NA pada kolom nilai
## [1] 4
sum(is.na(df_na$usia))   # total NA pada kolom usia
## [1] 3
sum(is.na(df_na))        # total NA seluruh data frame
## [1] 7

5. Menampilkan Baris yang Mengandung Missing Value

df_na[!complete.cases(df_na), ]
##     nama nilai usia
## 2   Budi    NA   21
## 3  Citra    75   NA
## 4   Dewi    NA   22
## 6   Fani    85   NA
## 7   Gita    NA   23
## 9   Iwan    88   NA
## 10  Joko    NA   22

Kesimpulan: Fungsi is.na() menghasilkan matriks logika TRUE/FALSE untuk seluruh elemen data frame. Fungsi which(is.na()) menampilkan indeks baris yang mengandung NA sehingga lebih mudah menemukan lokasi data hilang. Fungsi complete.cases() melengkapi keduanya dengan menampilkan baris yang tidak lengkap datanya.


Referensi:
Wickham, H. & Grolemund, G. (2017). R for Data Science. O’Reilly Media. https://r4ds.had.co.nz/vectors.html