Nomor 1

nama_vector <- c(5, FALSE, "true", "8.3", "Statistika")
nama_vector
## [1] "5"          "FALSE"      "true"       "8.3"        "Statistika"
str(nama_vector)
##  chr [1:5] "5" "FALSE" "true" "8.3" "Statistika"
class(nama_vector)
## [1] "character"

Fungsi c() (combine) di R digunakan untuk membentuk atomic vector.

Sifat utama atomic vector adalah: semua elemen harus memiliki tipe data yang sama (homogen). Karena elemen-elemen yang dimasukkan terdiri dari beberapa tipe data berbeda:

maka R akan melakukan type coercion otomatis ke tipe data yang paling “tinggi” dalam hierarki coercion (logical → integer → numeric → character). Karena terdapat elemen bertipe character, seluruh elemen dipaksa menjadi character.

Kesimpulan Nomor 1

Nomor 2

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"
str(contoh_list)
## List of 5
##  $ : num 5
##  $ : logi FALSE
##  $ : chr "true"
##  $ : num 8.3
##  $ : chr "Statistika"

Perbedaan List dan Vektor

Aspek Vector List
Homogenitas Harus 1 tipe data Bisa berbeda tipe
Coercion Terjadi otomatis Tidak terjadi
Struktur Atomic Recursive
Akses elemen [] [] dan [[]]
Fleksibilitas Terbatas Sangat fleksibel

Kesimpulan Nomor 2

Nomor 3

Nomor 3a

kelompok_kkn <- data.frame(
  nama  = c("Messi", "Ronaldo", "Neymar", "Modric", 
            "Kroos", "Vitinha", "Marcelo", "Ramos",
            "Mbappe", "Ronaldinho"),
  nim   = c("1234567891", "1234567892", "1234567893", "1234567894",
            "1234567895", "1234567896", "1234567897", "1234567898",
            "1234567899", "1234567800"),
  prodi = c("Staterkom", "SSD", "Akuntansi", "Manajemen",
            "SeniBahasa", "SeniTari", "SeniMusik", "Psikologi",
            "HukumPidana", "Informatika"),
  stringsAsFactors = FALSE
)
kelompok_kkn
##          nama        nim       prodi
## 1       Messi 1234567891   Staterkom
## 2     Ronaldo 1234567892         SSD
## 3      Neymar 1234567893   Akuntansi
## 4      Modric 1234567894   Manajemen
## 5       Kroos 1234567895  SeniBahasa
## 6     Vitinha 1234567896    SeniTari
## 7     Marcelo 1234567897   SeniMusik
## 8       Ramos 1234567898   Psikologi
## 9      Mbappe 1234567899 HukumPidana
## 10 Ronaldinho 1234567800 Informatika

data.frame() digunakan untuk membentuk struktur data tabular dua dimensi, di mana setiap kolom dapat memiliki tipe data berbeda (numeric, character, dsb), namun panjang setiap kolom harus sama. Argumen stringsAsFactors = FALSE memastikan kolom karakter (nama, nim, prodi) tetap disimpan sebagai character, bukan dikonversi otomatis menjadi factor.

Nomor 3b

kelompok_kkn$nama
##  [1] "Messi"      "Ronaldo"    "Neymar"     "Modric"     "Kroos"     
##  [6] "Vitinha"    "Marcelo"    "Ramos"      "Mbappe"     "Ronaldinho"

Operator $ digunakan untuk mengakses satu kolom dari data frame berdasarkan nama kolomnya secara langsung, dan akan mengembalikan kolom tersebut dalam bentuk vector.

Nomor 3c

kelompok_kkn[1:5, ]
##      nama        nim      prodi
## 1   Messi 1234567891  Staterkom
## 2 Ronaldo 1234567892        SSD
## 3  Neymar 1234567893  Akuntansi
## 4  Modric 1234567894  Manajemen
## 5   Kroos 1234567895 SeniBahasa

Notasi [baris, kolom] digunakan untuk melakukan indexing pada data frame. Karena posisi kolom dikosongkan, R akan menampilkan seluruh kolom untuk baris ke-1 sampai ke-5 sesuai rentang 1:5.

Nomor 3d

kelompok_kkn[, c("nama", "prodi")]
##          nama       prodi
## 1       Messi   Staterkom
## 2     Ronaldo         SSD
## 3      Neymar   Akuntansi
## 4      Modric   Manajemen
## 5       Kroos  SeniBahasa
## 6     Vitinha    SeniTari
## 7     Marcelo   SeniMusik
## 8       Ramos   Psikologi
## 9      Mbappe HukumPidana
## 10 Ronaldinho Informatika

Dengan mengosongkan posisi baris dan menuliskan nama-nama kolom dalam bentuk vector character pada posisi kolom, R akan menampilkan seluruh baris namun hanya untuk kolom nama dan prodi saja.

Nomor 3e

kelompok_kkn[3, "nim"]
## [1] "1234567893"

Notasi ini mengambil elemen spesifik pada baris ke-3 dan kolom nim, sehingga hasil yang dikembalikan adalah satu nilai tunggal, yaitu NIM dari anggota kelompok pada baris ketiga (Neymar).

Kesimpulan Nomor 3

  • data.frame cocok digunakan untuk merepresentasikan data tabular dengan kolom-kolom yang memiliki tipe data berbeda.
  • Pemanggilan elemen dapat dilakukan dengan berbagai cara: $ untuk satu kolom, [baris, ] untuk satu/lebih baris, [, "nama_kolom"] untuk satu/lebih kolom, dan [baris, kolom] untuk elemen spesifik.
  • Indexing pada data frame bersifat dua dimensi, berbeda dengan vector yang hanya satu dimensi.

Nomor 4

Nomor 4a

data_na <- data.frame(
  id     = 1:10,
  nilai  = c(85, NA, 78, 92, NA, 88, 95, NA, 80, 87),
  status = c("Lulus", NA, "Lulus", "Lulus", NA, "Lulus", "Lulus", NA, "Lulus", "Lulus")
)
data_na
##    id nilai status
## 1   1    85  Lulus
## 2   2    NA   <NA>
## 3   3    78  Lulus
## 4   4    92  Lulus
## 5   5    NA   <NA>
## 6   6    88  Lulus
## 7   7    95  Lulus
## 8   8    NA   <NA>
## 9   9    80  Lulus
## 10 10    87  Lulus
# Mendeteksi posisi NA
is.na(data_na)
##          id nilai status
##  [1,] FALSE FALSE  FALSE
##  [2,] FALSE  TRUE   TRUE
##  [3,] FALSE FALSE  FALSE
##  [4,] FALSE FALSE  FALSE
##  [5,] FALSE  TRUE   TRUE
##  [6,] FALSE FALSE  FALSE
##  [7,] FALSE FALSE  FALSE
##  [8,] FALSE  TRUE   TRUE
##  [9,] FALSE FALSE  FALSE
## [10,] FALSE FALSE  FALSE

is.na() digunakan untuk mendeteksi keberadaan missing value (NA) pada setiap elemen data frame, dan mengembalikan matriks logika berukuran sama dengan data frame asal, di mana TRUE menandakan elemen tersebut adalah NA.

Nomor 4b

colSums(is.na(data_na))
##     id  nilai status 
##      0      3      3

colSums(is.na(data_na)) menghitung jumlah nilai NA pada setiap kolom dengan cara menjumlahkan nilai logika TRUE (dianggap 1) hasil dari is.na() per kolom. Dari hasil ini terlihat bahwa kolom nilai dan status masing-masing memiliki nilai yang hilang.

Nomor 4c

data_na[rowSums(is.na(data_na)) > 0, ]
##   id nilai status
## 2  2    NA   <NA>
## 5  5    NA   <NA>
## 8  8    NA   <NA>

rowSums(is.na(data_na)) > 0 menghasilkan vector logika yang bernilai TRUE untuk setiap baris yang mengandung minimal satu nilai NA. Vector logika ini kemudian digunakan untuk melakukan filtering baris pada data_na, sehingga hanya baris-baris yang mengandung missing value yang ditampilkan.

Beberapa hal penting terkait missing value di R: NA adalah representasi missing value, is.na() selalu mengembalikan nilai logika (TRUE/FALSE), missing value (NA) berbeda dengan string kosong (""), dan operasi aritmatika yang melibatkan NA akan menghasilkan NA kecuali ditangani dengan argumen na.rm = TRUE (misalnya pada mean(data_na$nilai, na.rm = TRUE)).

Kesimpulan Nomor 4

  • is.na() adalah fungsi dasar untuk mendeteksi missing value secara elemen-per-elemen.
  • colSums(is.na(df)) berguna untuk melihat ringkasan jumlah NA per kolom, membantu mengidentifikasi kolom mana yang paling banyak memiliki data hilang.
  • rowSums(is.na(df)) > 0 berguna untuk menyaring baris-baris bermasalah agar dapat ditangani lebih lanjut (misalnya dihapus dengan na.omit() atau diimputasi).

Interpretasi Keseluruhan

Keempat nomor pada praktikum ini saling berkaitan dan membentuk pemahaman bertahap mengenai struktur data dasar di R, mulai dari level satu dimensi hingga manipulasi data tabular.

Nomor 1 dan Nomor 2 sama-sama menggunakan lima elemen dengan tipe data yang berbeda-beda, namun dibungkus dengan struktur yang berbeda (c() vs list()). Perbandingan ini memperlihatkan perbedaan paling mendasar antara atomic vector yang homogen dan list yang heterogen, sekaligus menjadi dasar untuk memahami mengapa data.frame (yang sebenarnya adalah list dari vector-vector dengan panjang sama) bisa menampung kolom dengan tipe data berbeda namun tetap homogen di dalam masing-masing kolomnya.

Nomor 3 membawa konsep tersebut ke struktur dua dimensi melalui data.frame, sekaligus memperkenalkan berbagai teknik indexing ($, [baris, ], [, kolom], [baris, kolom]) yang menjadi keterampilan dasar untuk mengeksplorasi dan mengambil bagian tertentu dari suatu dataset.

Nomor 4 melanjutkan pembahasan data.frame dengan menambahkan permasalahan yang sangat umum dijumpai dalam data nyata, yaitu missing value. Teknik is.na(), colSums(), dan rowSums() yang dipelajari di sini merupakan langkah awal yang penting sebelum melakukan pembersihan data (data cleaning) lebih lanjut, seperti penghapusan baris (na.omit()) atau imputasi nilai yang hilang.

Kesimpulan Umum

Secara keseluruhan, praktikum ini menunjukkan bahwa:

  1. R menyediakan beberapa struktur data dasar (vector, list, data frame) dengan sifat dan tujuan penggunaan yang berbeda; pemilihan struktur yang tepat bergantung pada homogenitas dan kompleksitas data yang ingin direpresentasikan.
  2. Coercion adalah mekanisme penting yang perlu dipahami, karena dapat mengubah tipe data secara diam-diam (implicit) jika tidak disadari, sebagaimana terlihat pada vector di Nomor 1.
  3. data.frame merupakan struktur yang paling relevan untuk analisis data statistika, karena mampu menampung kolom-kolom dengan tipe berbeda sekaligus tetap terorganisir dalam bentuk tabel.
  4. Penguasaan teknik indexing (Nomor 3) dan deteksi missing value (Nomor 4) merupakan dua keterampilan fundamental yang akan terus digunakan pada tahap analisis data dan statistika yang lebih lanjut di praktikum-praktikum berikutnya.
  5. Pemahaman terhadap struktur data dasar ini menjadi pondasi penting sebelum melangkah ke tahap manipulasi data yang lebih kompleks, seperti transformasi data, agregasi, maupun visualisasi statistik.