BAB 6 — Lists and Data Frames

6.1 Lists

List adalah objek yang dapat menyimpan berbagai jenis data sekaligus, misalnya teks, angka, vector, bahkan matrix. Komponen list dapat diakses dengan $, [[ ]], atau [ ].

mahasiswa <- list(
  nama = "Rafael",
  umur = 20,
  nilai = c(80, 85, 90)
)

mahasiswa
## $nama
## [1] "Rafael"
## 
## $umur
## [1] 20
## 
## $nilai
## [1] 80 85 90
mahasiswa$nama
## [1] "Rafael"
mahasiswa[[2]]
## [1] 20
mahasiswa$nilai
## [1] 80 85 90
length(mahasiswa)
## [1] 3

Penjelasan

list() digunakan untuk membuat sebuah list. List mahasiswa terdiri dari tiga komponen, yaitu nama, umur, dan nilai. Komponen dapat dipanggil menggunakan $ atau nomor posisinya dengan [[ ]]. length() digunakan untuk mengetahui jumlah komponen utama.

Kesimpulan

List dapat menyimpan beberapa jenis data berbeda dalam satu objek dan setiap komponennya dapat diakses secara terpisah.

6.2 Constructing and Modifying Lists

List dapat dibuat dari beberapa objek dan diperluas dengan menambahkan komponen baru.

data_mhs <- list(
  nama = "Andi",
  umur = 19
)

data_mhs
## $nama
## [1] "Andi"
## 
## $umur
## [1] 19
# Menambahkan komponen baru
data_mhs[3] <- list(nilai = 88)

data_mhs
## $nama
## [1] "Andi"
## 
## $umur
## [1] 19
## 
## [[3]]
## [1] 88

Penjelasan

Awalnya data_mhs memiliki dua komponen. Kemudian komponen ketiga bernama nilai ditambahkan menggunakan indeks [3].

Kesimpulan

List bersifat fleksibel karena komponennya dapat ditambah setelah list dibuat.

6.2.1 Concatenating Lists

Fungsi c() dapat menggabungkan beberapa list menjadi satu list.

list_A <- list(nama = "Andi")
list_B <- list(umur = 19)
list_C <- list(nilai = 88)

list_gabungan <- c(list_A, list_B, list_C)

list_gabungan
## $nama
## [1] "Andi"
## 
## $umur
## [1] 19
## 
## $nilai
## [1] 88

Penjelasan

c() menggabungkan seluruh komponen dari list_A, list_B, dan list_C secara berurutan.

Kesimpulan

Beberapa list dapat digabungkan menjadi satu list baru menggunakan fungsi c().

6.3 Data Frames

Data frame adalah struktur berbentuk tabel. Setiap kolom dapat mempunyai tipe data yang berbeda, tetapi jumlah barisnya harus sesuai.

mahasiswa_df <- data.frame(
  Nama = c("Andi", "Budi", "Citra"),
  Umur = c(19, 20, 21),
  Lulus = c(TRUE, FALSE, TRUE)
)

mahasiswa_df
##    Nama Umur Lulus
## 1  Andi   19  TRUE
## 2  Budi   20 FALSE
## 3 Citra   21  TRUE
class(mahasiswa_df)
## [1] "data.frame"

Penjelasan

Data frame memiliki tiga kolom dengan tipe berbeda: Nama berupa character, Umur berupa numeric, dan Lulus berupa logical.

Kesimpulan

Data frame digunakan untuk menyimpan data berbentuk tabel yang kolom-kolomnya dapat memiliki tipe data berbeda.

6.3.1 Making Data Frames

Subbab ini secara khusus membahas pembuatan data frame menggunakan data.frame() dan konversi menggunakan as.data.frame().

nama <- c("Andi", "Budi", "Citra")
nilai <- c(80, 75, 90)

df_nilai <- data.frame(
  Nama = nama,
  Nilai = nilai
)

df_nilai
##    Nama Nilai
## 1  Andi    80
## 2  Budi    75
## 3 Citra    90

konversi list:

list_nilai <- list(
  Nama = c("Andi", "Budi"),
  Nilai = c(80, 90)
)

df_dari_list <- as.data.frame(list_nilai)

df_dari_list
##   Nama Nilai
## 1 Andi    80
## 2 Budi    90

Penjelasan

data.frame() membentuk data frame langsung dari beberapa vector. as.data.frame() digunakan untuk mengubah objek yang sesuai, seperti list, menjadi data frame.

Kesimpulan

Data frame dapat dibuat secara langsung dengan data.frame() maupun dari objek lain menggunakan as.data.frame().

6.3.2 attach() and detach()

attach() membuat kolom data frame dapat dipanggil langsung, sedangkan detach() menghapus data frame tersebut dari search path.

df_attach <- data.frame(
  nilai_uts = c(70, 80, 90),
  nilai_uas = c(75, 85, 95)
)

# Mencegah attach ganda jika kode dijalankan ulang
if ("df_attach" %in% search()) {
  detach("df_attach")
}

attach(df_attach)

nilai_uts
## [1] 70 80 90
mean(nilai_uts)
## [1] 80
detach("df_attach")

Penjelasan

Setelah attach(df_attach), kolom nilai_uts dapat dipanggil tanpa menulis df_attach$nilai_uts. Setelah selesai, detach() digunakan untuk melepaskannya kembali.

Kesimpulan

attach() mempermudah akses sementara terhadap kolom data frame dan detach() mengembalikannya ke kondisi semula.

6.3.3 Working with Data Frames

Subbab ini membahas cara bekerja dengan data frame dan menyimpan variabel yang berkaitan dalam satu struktur.

nilai_mhs <- data.frame(
  Nama = c("Andi", "Budi", "Citra"),
  UTS = c(80, 70, 90),
  UAS = c(85, 75, 95)
)

# Menambahkan kolom baru
nilai_mhs$Rata_rata <- (
  nilai_mhs$UTS + nilai_mhs$UAS
) / 2

nilai_mhs
##    Nama UTS UAS Rata_rata
## 1  Andi  80  85      82.5
## 2  Budi  70  75      72.5
## 3 Citra  90  95      92.5

Penjelasan

Kolom Rata_rata dibuat dari nilai UTS dan UAS kemudian ditambahkan langsung ke dalam data frame.

Kesimpulan

Data frame dapat dimodifikasi dan diperluas dengan menambahkan variabel atau kolom baru.

6.3.4 Attaching Arbitrary Lists

Selain data frame, objek dengan mode list juga dapat digunakan dengan attach().

list_data <- list(
  data_x = c(10, 20, 30),
  data_y = c(5, 10, 15)
)

if ("list_data" %in% search()) {
  detach("list_data")
}

attach(list_data)

data_x
## [1] 10 20 30
data_y
## [1]  5 10 15
data_x + data_y
## [1] 15 30 45
detach("list_data")

Penjelasan

Setelah list di-attach, komponen data_x dan data_y dapat digunakan langsung seperti variabel biasa.

Kesimpulan

attach() tidak hanya dapat digunakan pada data frame, tetapi juga pada list.

6.3.5 Managing the Search Path

Fungsi search() digunakan untuk melihat search path yang aktif, sedangkan ls() dapat digunakan untuk melihat objek dalam posisi search path tertentu.

df_path <- data.frame(
  variabel_a = 1:3,
  variabel_b = 4:6
)

# Search path sebelum attach
search()
## [1] ".GlobalEnv"        "package:stats"     "package:graphics" 
## [4] "package:grDevices" "package:utils"     "package:datasets" 
## [7] "package:methods"   "Autoloads"         "package:base"
if ("df_path" %in% search()) {
  detach("df_path")
}

attach(df_path)

# Search path setelah attach
search()
##  [1] ".GlobalEnv"        "df_path"           "package:stats"    
##  [4] "package:graphics"  "package:grDevices" "package:utils"    
##  [7] "package:datasets"  "package:methods"   "Autoloads"        
## [10] "package:base"
# Melihat isi data frame yang terpasang
ls(pos = "df_path")
## [1] "variabel_a" "variabel_b"
detach("df_path")

# Search path setelah detach
search()
## [1] ".GlobalEnv"        "package:stats"     "package:graphics" 
## [4] "package:grDevices" "package:utils"     "package:datasets" 
## [7] "package:methods"   "Autoloads"         "package:base"

Penjelasan

search() menunjukkan objek dan package yang sedang tersedia pada search path. Setelah attach(df_path), nama df_path muncul. Setelah detach(), nama tersebut kembali hilang.

Kesimpulan

search() membantu mengetahui objek atau package apa saja yang sedang terpasang dan dapat diakses oleh R.

FULL EX BAB 6

# LISTS AND DATA FRAMES


# 6.1 Lists
mahasiswa <- list(
  nama = "Rafael",
  umur = 20,
  nilai = c(80, 85, 90)
)

mahasiswa
## $nama
## [1] "Rafael"
## 
## $umur
## [1] 20
## 
## $nilai
## [1] 80 85 90
mahasiswa$nama
## [1] "Rafael"
mahasiswa[[2]]
## [1] 20
mahasiswa$nilai
## [1] 80 85 90
length(mahasiswa)
## [1] 3
# 6.2 Constructing and Modifying Lists
data_mhs <- list(
  nama = "Andi",
  umur = 19
)

data_mhs
## $nama
## [1] "Andi"
## 
## $umur
## [1] 19
data_mhs[3] <- list(nilai = 88)

data_mhs
## $nama
## [1] "Andi"
## 
## $umur
## [1] 19
## 
## [[3]]
## [1] 88
# 6.2.1 Concatenating Lists
list_A <- list(nama = "Andi")
list_B <- list(umur = 19)
list_C <- list(nilai = 88)

list_gabungan <- c(list_A, list_B, list_C)

list_gabungan
## $nama
## [1] "Andi"
## 
## $umur
## [1] 19
## 
## $nilai
## [1] 88
# 6.3 Data Frames
mahasiswa_df <- data.frame(
  Nama = c("Andi", "Budi", "Citra"),
  Umur = c(19, 20, 21),
  Lulus = c(TRUE, FALSE, TRUE)
)

mahasiswa_df
##    Nama Umur Lulus
## 1  Andi   19  TRUE
## 2  Budi   20 FALSE
## 3 Citra   21  TRUE
class(mahasiswa_df)
## [1] "data.frame"
# 6.3.1 Making Data Frames
nama <- c("Andi", "Budi", "Citra")
nilai <- c(80, 75, 90)

df_nilai <- data.frame(
  Nama = nama,
  Nilai = nilai
)

df_nilai
##    Nama Nilai
## 1  Andi    80
## 2  Budi    75
## 3 Citra    90
list_nilai <- list(
  Nama = c("Andi", "Budi"),
  Nilai = c(80, 90)
)

df_dari_list <- as.data.frame(list_nilai)

df_dari_list
##   Nama Nilai
## 1 Andi    80
## 2 Budi    90
# 6.3.2 attach() and detach()
df_attach <- data.frame(
  nilai_uts = c(70, 80, 90),
  nilai_uas = c(75, 85, 95)
)

if ("df_attach" %in% search()) {
  detach("df_attach")
}

attach(df_attach)

nilai_uts
## [1] 70 80 90
mean(nilai_uts)
## [1] 80
detach("df_attach")


# 6.3.3 Working with Data Frames
nilai_mhs <- data.frame(
  Nama = c("Andi", "Budi", "Citra"),
  UTS = c(80, 70, 90),
  UAS = c(85, 75, 95)
)

nilai_mhs$Rata_rata <- (
  nilai_mhs$UTS + nilai_mhs$UAS
) / 2

nilai_mhs
##    Nama UTS UAS Rata_rata
## 1  Andi  80  85      82.5
## 2  Budi  70  75      72.5
## 3 Citra  90  95      92.5
# 6.3.4 Attaching Arbitrary Lists
list_data <- list(
  data_x = c(10, 20, 30),
  data_y = c(5, 10, 15)
)

if ("list_data" %in% search()) {
  detach("list_data")
}

attach(list_data)

data_x
## [1] 10 20 30
data_y
## [1]  5 10 15
data_x + data_y
## [1] 15 30 45
detach("list_data")


# 6.3.5 Managing the Search Path
df_path <- data.frame(
  variabel_a = 1:3,
  variabel_b = 4:6
)

search()
## [1] ".GlobalEnv"        "package:stats"     "package:graphics" 
## [4] "package:grDevices" "package:utils"     "package:datasets" 
## [7] "package:methods"   "Autoloads"         "package:base"
if ("df_path" %in% search()) {
  detach("df_path")
}

attach(df_path)

search()
##  [1] ".GlobalEnv"        "df_path"           "package:stats"    
##  [4] "package:graphics"  "package:grDevices" "package:utils"    
##  [7] "package:datasets"  "package:methods"   "Autoloads"        
## [10] "package:base"
ls(pos = "df_path")
## [1] "variabel_a" "variabel_b"
detach("df_path")

search()
## [1] ".GlobalEnv"        "package:stats"     "package:graphics" 
## [4] "package:grDevices" "package:utils"     "package:datasets" 
## [7] "package:methods"   "Autoloads"         "package:base"

BAB 7 — Reading Data from Files

Bab ini membahas pembacaan data dari file menggunakan read.table(), scan(), dataset bawaan, dataset package, serta pengeditan data.

7.1 The read.table() Function

Fokus subbab ini adalah membaca sebuah tabel dari file menjadi data frame. PDF menggunakan read.table() untuk tujuan tersebut.

file_tabel <- tempfile(fileext = ".txt")

writeLines(
  c(
    "Nama Nilai Umur",
    "Andi 80 19",
    "Budi 75 20",
    "Citra 90 21"
  ),
  file_tabel
)

data_tabel <- read.table(
  file_tabel,
  header = TRUE
)

data_tabel
##    Nama Nilai Umur
## 1  Andi    80   19
## 2  Budi    75   20
## 3 Citra    90   21

Penjelasan

tempfile() membuat lokasi file sementara. writeLines() hanya digunakan untuk menyediakan file contoh. Fokus utamanya adalah:

read.table(file_tabel, header = TRUE)

yang membaca isi file menjadi sebuah data frame. header = TRUE menunjukkan bahwa baris pertama merupakan nama kolom.

Kesimpulan

read.table() digunakan untuk membaca data tabel dari file eksternal ke dalam R.

7.2 The scan() Function

scan() merupakan fungsi untuk membaca data yang lebih sederhana dari file. Fungsi ini dapat menghasilkan vector maupun list.

file_scan <- tempfile(fileext = ".txt")

writeLines(
  c(
    "A 10 20",
    "B 30 40",
    "C 50 60"
  ),
  file_scan
)

data_scan <- scan(
  file_scan,
  what = list(
    id = "",
    x = 0,
    y = 0
  ),
  quiet = TRUE
)

data_scan
## $id
## [1] "A" "B" "C"
## 
## $x
## [1] 10 30 50
## 
## $y
## [1] 20 40 60
data_scan$id
## [1] "A" "B" "C"
data_scan$x
## [1] 10 30 50
data_scan$y
## [1] 20 40 60

Penjelasan

Pada what, nilai “” menunjukkan bahwa id dibaca sebagai character, sedangkan 0 menunjukkan bahwa x dan y dibaca sebagai numeric.

Kesimpulan

scan() dapat membaca data dari file dan menyimpannya sebagai vector atau list sesuai tipe data yang ditentukan.

7.3 Accessing Built-in Datasets

R memiliki dataset bawaan yang dapat langsung digunakan untuk pembelajaran dan analisis. PDF menggunakan fungsi data() untuk mengaksesnya.

data("iris")

head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
str(iris)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
summary(iris)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 

Penjelasan

data(“iris”) mengakses dataset bawaan iris. head() menampilkan enam baris pertama, str() menunjukkan struktur data, dan summary() menghasilkan ringkasan statistik.

Kesimpulan

Dataset bawaan R dapat digunakan tanpa perlu membuat atau mengimpor file sendiri.

7.3.1 Loading Data from Other R Packages

Dataset juga dapat dipanggil dari package tertentu menggunakan argumen package.

data(
  "Puromycin",
  package = "datasets"
)

head(Puromycin)
##   conc rate   state
## 1 0.02   76 treated
## 2 0.02   47 treated
## 3 0.06   97 treated
## 4 0.06  107 treated
## 5 0.11  123 treated
## 6 0.11  139 treated
summary(Puromycin)
##       conc             rate             state   
##  Min.   :0.0200   Min.   : 47.0   treated  :12  
##  1st Qu.:0.0600   1st Qu.: 91.5   untreated:11  
##  Median :0.1100   Median :124.0                 
##  Mean   :0.3122   Mean   :126.8                 
##  3rd Qu.:0.5600   3rd Qu.:158.5                 
##  Max.   :1.1000   Max.   :207.0

Penjelasan

Argumen: package = “datasets”

menunjukkan bahwa dataset Puromycin diambil dari package datasets.

Kesimpulan

Fungsi data() dengan argumen package dapat digunakan untuk mengambil dataset dari package tertentu.

7.4 Editing Data

PDF membahas edit() dan fix() untuk mengedit data melalui editor seperti spreadsheet.

Masalahnya, edit() bersifat interaktif. Kalau dijalankan langsung saat Knit, proses dapat berhenti menunggu jendela editor.

data_edit <- data.frame(
  Nama = c("Andi", "Budi"),
  Nilai = c(80, 75)
)

data_edit
##   Nama Nilai
## 1 Andi    80
## 2 Budi    75
if (interactive()) {
  data_hasil_edit <- edit(data_edit)
} else {
  data_hasil_edit <- data_edit
}

data_hasil_edit
##   Nama Nilai
## 1 Andi    80
## 2 Budi    75

Penjelasan

Jika kode dijalankan langsung secara interaktif di RStudio Console, edit(data_edit) akan membuka editor data. Saat proses Knit, interactive() bernilai FALSE, sehingga R Markdown tidak berhenti menunggu jendela editor.

Kesimpulan

edit() digunakan untuk mengubah data secara interaktif melalui tampilan seperti spreadsheet. Pemeriksaan interactive() membuat kode tetap aman saat dijalankan melalui R Markdown.

FULL EX BAB 7

# READING DATA FROM FILES


# 7.1 read.table()
file_tabel <- tempfile(fileext = ".txt")

writeLines(
  c(
    "Nama Nilai Umur",
    "Andi 80 19",
    "Budi 75 20",
    "Citra 90 21"
  ),
  file_tabel
)

data_tabel <- read.table(
  file_tabel,
  header = TRUE
)

data_tabel
##    Nama Nilai Umur
## 1  Andi    80   19
## 2  Budi    75   20
## 3 Citra    90   21
# 7.2 scan()
file_scan <- tempfile(fileext = ".txt")

writeLines(
  c(
    "A 10 20",
    "B 30 40",
    "C 50 60"
  ),
  file_scan
)

data_scan <- scan(
  file_scan,
  what = list(
    id = "",
    x = 0,
    y = 0
  ),
  quiet = TRUE
)

data_scan
## $id
## [1] "A" "B" "C"
## 
## $x
## [1] 10 30 50
## 
## $y
## [1] 20 40 60
data_scan$id
## [1] "A" "B" "C"
data_scan$x
## [1] 10 30 50
data_scan$y
## [1] 20 40 60
# 7.3 Built-in Datasets
data("iris")

head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
str(iris)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
summary(iris)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 
# 7.3.1 Data from R Packages
data(
  "Puromycin",
  package = "datasets"
)

head(Puromycin)
##   conc rate   state
## 1 0.02   76 treated
## 2 0.02   47 treated
## 3 0.06   97 treated
## 4 0.06  107 treated
## 5 0.11  123 treated
## 6 0.11  139 treated
summary(Puromycin)
##       conc             rate             state   
##  Min.   :0.0200   Min.   : 47.0   treated  :12  
##  1st Qu.:0.0600   1st Qu.: 91.5   untreated:11  
##  Median :0.1100   Median :124.0                 
##  Mean   :0.3122   Mean   :126.8                 
##  3rd Qu.:0.5600   3rd Qu.:158.5                 
##  Max.   :1.1000   Max.   :207.0
# 7.4 Editing Data
data_edit <- data.frame(
  Nama = c("Andi", "Budi"),
  Nilai = c(80, 75)
)

data_edit
##   Nama Nilai
## 1 Andi    80
## 2 Budi    75
if (interactive()) {
  data_hasil_edit <- edit(data_edit)
} else {
  data_hasil_edit <- data_edit
}

data_hasil_edit
##   Nama Nilai
## 1 Andi    80
## 2 Budi    75