Soal Nomor 1: Ketikkan perintah berikut dan jelaskan hasilnya.

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

Perintah di atas Digunakan untuk membentuk sebuah objek bertipe vector melalui fungsi c() (combine), yang merupakan mekanisme dasar penggabungan elemen di R. Secara konseptual, vector dalam R bersifat homogen, artinya seluruh elemen di dalamnya harus memiliki tipe data yang sama.

Pada saat proses pembentukan vector tersebut, elemen yang dimasukkan memiliki tipe data berbeda, yaitu:

5 bertipe numeric, FALSE bertipe logical, “true”, “8.3”, dan “Statistika” bertipe character

Karena terdapat elemen bertipe character, maka R menerapkan mekanisme otomatis yang disebut implicit type coercion. Dalam sistem hierarki tipe data atomik R, urutan prioritas coercion adalah: logical → integer → double → character. Artinya, jika dalam satu vector terdapat tipe data yang lebih “tinggi” dalam hierarki tersebut, maka seluruh elemen akan dikonversi mengikuti tipe tertinggi yang ada. Dalam kasus ini, karena terdapat elemen character, maka seluruh elemen lainnya (numeric dan logical) dikonversi menjadi character.

Akibatnya: 5 berubah menjadi “5”, FALSE berubah menjadi “FALSE”

Soal Nomor 2: Cobalah untuk membuat List dengan nama contoh_list yang memiliki elemen sama dengan Latihan no.1, dan panggil seluruh elemen. Berikan perbedaan list dan vector yang dapat kalian peroleh setelah melakukan perintah tersebut.

contoh_list <- list(5, FALSE, "true", "8.3", "Statistika")
#Menampilkan seluruh elemen list
contoh_list
## [[1]]
## [1] 5
## 
## [[2]]
## [1] FALSE
## 
## [[3]]
## [1] "true"
## 
## [[4]]
## [1] "8.3"
## 
## [[5]]
## [1] "Statistika"
# Mengecek tipe data
class(contoh_list)
## [1] "list"
# Mengecek struktur data
str(contoh_list)
## List of 5
##  $ : num 5
##  $ : logi FALSE
##  $ : chr "true"
##  $ : chr "8.3"
##  $ : chr "Statistika"

Berdasarkan perintah untuk membuat list dengan nama contoh_list yang memiliki elemen sama seperti pada Latihan No.1, diperoleh objek yang berisi nilai 5, FALSE, “true”, “8.3”, dan “Statistika”. Ketika seluruh elemen dipanggil, terlihat bahwa setiap komponen ditampilkan secara terpisah dengan indeks berbentuk [[1]], [[2]], dan seterusnya. Format ini menunjukkan bahwa setiap elemen dalam list disimpan sebagai objek independen.

Dari hasil tersebut dapat diperoleh perbedaan mendasar antara list dan vector di R. Vector bersifat homogen, artinya seluruh elemennya harus memiliki tipe data yang sama. Jika terdapat perbedaan tipe, R akan secara otomatis melakukan implicit type coercion mengikuti hierarki tipe data (logical → integer → numeric → character). Inilah sebabnya pada Latihan No.1 seluruh elemen berubah menjadi tipe character ketika digabungkan dalam sebuah vector.

Sebaliknya, list bersifat heterogen dan tidak menerapkan mekanisme type coercion. Setiap elemen mempertahankan tipe data aslinya. Nilai 5 tetap numeric, FALSE tetap logical, dan nilai bertanda kutip tetap character.

Soal Nomor 3: Dalam melakukan pemanggilan elemen, kita dapat menggunakan index elemen atau nama kolom. Buatlah data frame dengan nama kelompok_kkn berupa tabel tiga kolom terdiri atas: nama, nim, dan prodi. Isikan minimal 10 baris. Lakukan eksperimen pemanggilan isi tabel, meliputi pemanggilan baris, kolom, dan elemen tabel. Jelaskan mengenai perbedaan cara pemanggilan dalam data frame tersebut.

kelompok_kkn <- data.frame(
  nama = c("Andi", "Budi", "Alya", "Ibtisam", "Princes",
           "Fajar", "Honey", "Hadi", "Alyaku", "Joko"),
  nim = c(22001, 22002, 22003, 22004, 22005,
          22006, 22007, 22008, 22009, 22010),
  prodi = c("PGSD", "Kimia", "IPA", "IPA", "IPA",
            "Fisika", "Manajemen", "Biologi", "Farmasi", "Kimia")
)
kelompok_kkn
##       nama   nim     prodi
## 1     Andi 22001      PGSD
## 2     Budi 22002     Kimia
## 3     Alya 22003       IPA
## 4  Ibtisam 22004       IPA
## 5  Princes 22005       IPA
## 6    Fajar 22006    Fisika
## 7    Honey 22007 Manajemen
## 8     Hadi 22008   Biologi
## 9   Alyaku 22009   Farmasi
## 10    Joko 22010     Kimia

Pemanggilan Baris (Row Indexing)

#a.Berdasarkan baris tertentu
kelompok_kkn[1, ]
##   nama   nim prodi
## 1 Andi 22001  PGSD
#b.Mengambil beberapa baris sekaligus
kelompok_kkn[c(2, 4, 6), ]
##      nama   nim  prodi
## 2    Budi 22002  Kimia
## 4 Ibtisam 22004    IPA
## 6   Fajar 22006 Fisika
#c.Mengambil rentang baris
kelompok_kkn[3:7, ]
##      nama   nim     prodi
## 3    Alya 22003       IPA
## 4 Ibtisam 22004       IPA
## 5 Princes 22005       IPA
## 6   Fajar 22006    Fisika
## 7   Honey 22007 Manajemen

Pemanggilan Kolom (Column Extraction)

#a.Berdasarkan posisi numerik
kelompok_kkn[, 1]
##  [1] "Andi"    "Budi"    "Alya"    "Ibtisam" "Princes" "Fajar"   "Honey"  
##  [8] "Hadi"    "Alyaku"  "Joko"
#b.Mengambil beberapa kolom
kelompok_kkn[, c(1, 3)]
##       nama     prodi
## 1     Andi      PGSD
## 2     Budi     Kimia
## 3     Alya       IPA
## 4  Ibtisam       IPA
## 5  Princes       IPA
## 6    Fajar    Fisika
## 7    Honey Manajemen
## 8     Hadi   Biologi
## 9   Alyaku   Farmasi
## 10    Joko     Kimia
#c.Berdasarkan nama kolom (string)
kelompok_kkn[, "nama"]
##  [1] "Andi"    "Budi"    "Alya"    "Ibtisam" "Princes" "Fajar"   "Honey"  
##  [8] "Hadi"    "Alyaku"  "Joko"
#d.Menggunakan operator $
kelompok_kkn$nama
##  [1] "Andi"    "Budi"    "Alya"    "Ibtisam" "Princes" "Fajar"   "Honey"  
##  [8] "Hadi"    "Alyaku"  "Joko"

Pemanggilan Elemen Spesifik

#a.Berdasarkan Indeks Numeric
kelompok_kkn[3, 2]
## [1] 22003
#b.Kombinasi Indeks dan Nama Kolom
kelompok_kkn[4, "prodi"]
## [1] "IPA"
#.Menggunakan which() untuk presisi posisi
kelompok_kkn[which(kelompok_kkn$nama == "Gina"), "nim"]
## numeric(0)

1.Pemanggilan Baris:

a.kelompok_kkn[1, ] Ekspresi ini menginstruksikan R untuk mengekstraksi observasi pada posisi baris ke-2 tanpa melakukan pembatasan terhadap kolom. Tanda koma tetap harus dituliskan karena R membaca struktur ini sebagai sistem dua indeks. Ketika bagian kolom dibiarkan kosong, R menginterpretasikannya sebagai:

Sertakan seluruh variabel yang tersedia pada baris tersebut.

Output yang dihasilkan tetap berupa data frame satu baris, bukan vektor, karena secara struktural objek tersebut masih memiliki lebih dari satu kolom. Dengan kata lain, dimensi kolom tetap dipertahankan sehingga sifat dua dimensinya tidak hilang.

b.kelompok_kkn[c(2, 4, 6), ] Pada sintaks ini, indeks baris diberikan dalam bentuk vektor numerik. Artinya, R diminta untuk mengambil beberapa observasi yang posisinya telah ditentukan secara eksplisit.

R akan:

Membaca vektor indeks. Mengambil baris sesuai urutan indeks tersebut. Menggabungkannya kembali menjadi satu data frame baru.

c.kelompok_kkn[3:7, ] Sintaks ini berarti: Ambil seluruh observasi dari posisi ke-3 sampai posisi ke-7 secara kontinu

2.Pemanggilan Kolom

a.kelompok_kkn[, 1]

Ekspresi ini mengambil seluruh baris pada kolom pertama. Berbeda dengan pemanggilan beberapa kolom, hasil dari pemanggilan satu kolom saja akan disederhanakan menjadi vektor satu dimensi. R secara default melakukan penyederhanaan dimensi (dimension dropping) ketika hanya satu kolom yang dipilih. Artinya, struktur dua dimensi hilang dan berubah menjadi struktur linear.

b.kelompok_kkn[, c(1, 3)] Di sini, dua kolom dipilih sekaligus. Karena jumlah kolom lebih dari satu, struktur dua dimensi tetap dipertahankan. Hasilnya berupa data frame baru yang terdiri dari kolom pertama dan ketiga. Pemilihan berbasis indeks numerik seperti ini bersifat sensitif terhadap perubahan urutan kolom. Jika struktur tabel berubah, indeks numerik bisa menunjuk ke variabel yang berbeda.

c.kelompok_kkn[, “nama”] Pendekatan berbasis nama kolom lebih stabil dibanding numerik. R akan mencari kolom dengan label “nama” tanpa memperhatikan posisinya dalam tabel.

d.kelompok_kkn$nama Operator $ merupakan bentuk akses langsung terhadap kolom berdasarkan namanya. Secara teknis:

Menghasilkan vektor. Lebih ringkas. Sangat praktis untuk eksplorasi cepat.

Namun operator ini tidak dapat digunakan untuk memilih lebih dari satu kolom sekaligus, sehingga penggunaannya terbatas pada satu variabel.

3.Pemanggilan Elemen Spesifik

a.kelompok_kkn[3, 2] Sintaks ini bekerja seperti koordinat matriks: baris ke-3 dan kolom ke-2. Hasilnya berupa satu nilai tunggal (scalar). Struktur dua dimensi tidak lagi dipertahankan karena hanya satu titik data yang diambil.

b.kelompok_kkn[4, “prodi”] Di sini, baris ditentukan secara numerik dan kolom ditentukan berdasarkan nama. Kombinasi ini meningkatkan keterbacaan karena kolom yang dituju jelas secara semantik.

c.kelompok_kkn[which(kelompok_kkn$nama == “Gina”), “nim”] Sintaks ini menunjukkan seleksi berbasis kondisi.

Tahapan logis yang terjadi: 1.kelompok_kkn$nama == “Gina” menghasilkan vektor logika. 2.which() mengonversi nilai TRUE menjadi indeks numerik. 3.Indeks tersebut digunakan untuk mengambil nilai pada kolom “nim”.

Soal Nomor 4: Buatlah data frame yang beberapa datanya berupa missing value. Carilah letak atau posisi data yang berupa missing value tersebut dengan menggunakan perintah is.na

data_mahasiswa <- data.frame(
  nama  = c("Andi","Budi","Alya","Ibtisam","Princes",
            "Fajar","Lia","Hadi","Alya","Joko"),
  nim   = c(22001,22002,NA,22004,22005,
            22006,NA,22008,22009,22010),
  prodi = c("Hukum","DKV","IPA",NA,"Statistika",
            "Farmasi","Fisika","Kimia",NA,"Informatika"),
  ipk   = c(3.5,NA,3.8,3.2,NA,
            3.6,3.9,3.1,NA,3.7),
  stringsAsFactors = FALSE
)
data_mahasiswa
##       nama   nim       prodi ipk
## 1     Andi 22001       Hukum 3.5
## 2     Budi 22002         DKV  NA
## 3     Alya    NA         IPA 3.8
## 4  Ibtisam 22004        <NA> 3.2
## 5  Princes 22005  Statistika  NA
## 6    Fajar 22006     Farmasi 3.6
## 7      Lia    NA      Fisika 3.9
## 8     Hadi 22008       Kimia 3.1
## 9     Alya 22009        <NA>  NA
## 10    Joko 22010 Informatika 3.7

Mencari Missing Value

na_matrix <- is.na(data_mahasiswa)
na_matrix
##        nama   nim prodi   ipk
##  [1,] FALSE FALSE FALSE FALSE
##  [2,] FALSE FALSE FALSE  TRUE
##  [3,] FALSE  TRUE FALSE FALSE
##  [4,] FALSE FALSE  TRUE FALSE
##  [5,] FALSE FALSE FALSE  TRUE
##  [6,] FALSE FALSE FALSE FALSE
##  [7,] FALSE  TRUE FALSE FALSE
##  [8,] FALSE FALSE FALSE FALSE
##  [9,] FALSE FALSE  TRUE  TRUE
## [10,] FALSE FALSE FALSE FALSE

Mengetahui Jumlah Missing Value

sum(na_matrix)
## [1] 7

Objek data_mahasiswa dibangun sebagai sebuah data.frame yang berisi empat variabel utama: nama, nim, prodi, dan ipk. Secara struktur, ini adalah tabel dua dimensi dengan 10 observasi. Beberapa nilai sengaja dibiarkan kosong menggunakan NA, yang dalam R merepresentasikan missing value, bukan nol, bukan string kosong, dan bukan nilai yang salah — tetapi benar-benar nilai yang tidak tersedia. Keputusan menggunakan stringsAsFactors = FALSE juga penting secara teknis. Artinya, kolom karakter seperti nama dan prodi dipertahankan sebagai tipe character, bukan otomatis diubah menjadi factor. Ini membuat manipulasi teks lebih fleksibel dan menghindari konversi level yang sering menjadi sumber masalah dalam analisis lanjutan.

Fungsi is.na() tidak menghapus atau memperbaiki data, tetapi membuat representasi logika dari struktur yang sama. Setiap sel pada data frame dikonversi menjadi: 1.TRUE jika nilainya NA, 2.FALSE jika nilainya terisi.

Hasilnya adalah sebuah matriks logika dengan dimensi yang identik dengan data aslinya (10 × 4). Ini penting: struktur dipertahankan agar posisi missing tetap bisa dilacak secara presisi. Secara praktik, pendekatan ini mencerminkan tahap audit data. Sebelum melakukan analisis statistik, seorang analis yang berpengalaman tidak langsung menghitung rata-rata atau membangun model. Langkah pertama selalu memastikan integritas dan kelengkapan data.

Karena TRUE dalam konteks numerik bernilai 1 dan FALSE bernilai 0, fungsi sum() akan menghitung total nilai TRUE, yang berarti total seluruh missing value di dalam dataset.

Berdasarkan struktur data: 1.Kolom nim memiliki 2 NA, 2.Kolom prodi memiliki 2 NA, 3.Kolom ipk memiliki 3 NA, Total keseluruhan missing value = 7

Ini bukan sekadar angka. Angka tersebut menggambarkan bahwa 7 dari total 40 sel data (10 baris × 4 kolom) tidak terisi. Secara proporsional, sekitar 17,5% data tidak lengkap.