Dokumen ini berisi hasil mencoba seluruh contoh kode pada Bab 6 (Lists and data frames) dan Bab 7 (Reading data from files) dari bahan ajar Komputasi Statistika (R-intro). Setiap sub-bab disertai penjelasan singkat dan chunk kode yang sudah dijalankan beserta hasilnya.
Beberapa objek pada Bab 6 (seperti statef,
incomes, incomef) berasal dari contoh pada Bab
4 dan 5, sehingga didefinisikan ulang di awal agar kode bisa dijalankan
secara mandiri (reproducible).
state <- c("tas", "sa", "qld", "nsw", "nsw", "nt", "wa", "wa",
"qld", "vic", "nsw", "vic", "qld", "qld", "sa", "tas",
"sa", "nt", "wa", "vic", "qld", "nsw", "nsw", "wa",
"sa", "act", "nsw", "vic", "vic", "act")
statef <- factor(state)
incomes <- c(60, 49, 40, 61, 64, 60, 59, 54, 62, 69, 70, 42, 56,
61, 61, 61, 58, 51, 48, 65, 49, 49, 41, 48, 52, 46,
59, 46, 58, 43)
incomef <- factor(cut(incomes, breaks = 35 + 10 * (0:7)))
Sebuah list di R adalah kumpulan objek (komponen) yang terurut, dan komponennya boleh berbeda mode/tipe.
Lst <- list(name = "Fred", wife = "Mary", no.children = 3,
child.ages = c(4, 7, 9))
Lst
#> $name
#> [1] "Fred"
#>
#> $wife
#> [1] "Mary"
#>
#> $no.children
#> [1] 3
#>
#> $child.ages
#> [1] 4 7 9
# jumlah komponen top-level
length(Lst)
#> [1] 4
# mengakses komponen dengan nomor
Lst[[1]]
#> [1] "Fred"
Lst[[4]]
#> [1] 4 7 9
Lst[[4]][1]
#> [1] 4
# mengakses komponen dengan nama ($)
Lst$name
#> [1] "Fred"
Lst$wife
#> [1] "Mary"
Lst$child.ages[1]
#> [1] 4
# mengakses dengan nama dalam tanda kurung siku ganda
Lst[["name"]]
#> [1] "Fred"
# berguna bila nama komponen disimpan dalam variabel lain
nama_komponen <- "name"
Lst[[nama_komponen]]
#> [1] "Fred"
# perbedaan penting: [[...]] vs [...]
Lst[[1]] # objek tunggal, nama tidak ikut
#> [1] "Fred"
Lst[1] # sub-list, nama tetap ikut
#> $name
#> [1] "Fred"
List baru dapat dibentuk dengan fungsi list(). Contoh
berikut membuat list dengan empat komponen bernama:
Lst <- list(name_1 = 1, name_2 = "dua", name_3 = TRUE, name_4 = c(1, 2, 3))
Lst
#> $name_1
#> [1] 1
#>
#> $name_2
#> [1] "dua"
#>
#> $name_3
#> [1] TRUE
#>
#> $name_4
#> [1] 1 2 3
List dapat diperluas dengan menambahkan komponen baru, misalnya menambahkan sebuah matriks sebagai komponen ke-5:
Mat <- matrix(1:6, nrow = 2)
Lst[5] <- list(matrix = Mat)
Lst
#> $name_1
#> [1] 1
#>
#> $name_2
#> [1] "dua"
#>
#> $name_3
#> [1] TRUE
#>
#> $name_4
#> [1] 1 2 3
#>
#> [[5]]
#> [,1] [,2] [,3]
#> [1,] 1 3 5
#> [2,] 2 4 6
Fungsi c() dapat digunakan untuk menggabungkan beberapa
list menjadi satu list baru:
list.A <- list(a = 1, b = 2)
list.B <- list(c = "tiga")
list.C <- list(d = TRUE, e = c(1, 2))
list.ABC <- c(list.A, list.B, list.C)
list.ABC
#> $a
#> [1] 1
#>
#> $b
#> [1] 2
#>
#> $c
#> [1] "tiga"
#>
#> $d
#> [1] TRUE
#>
#> $e
#> [1] 1 2
Data frame adalah list dengan class "data.frame", di
mana setiap komponen (kolom) harus berupa vektor/faktor/matriks numerik
dengan panjang atau baris yang sama.
accountants <- data.frame(home = statef, loot = incomes, shot = incomef)
accountants
#> home loot shot
#> 1 tas 60 (55,65]
#> 2 sa 49 (45,55]
#> 3 qld 40 (35,45]
#> 4 nsw 61 (55,65]
#> 5 nsw 64 (55,65]
#> 6 nt 60 (55,65]
#> 7 wa 59 (55,65]
#> 8 wa 54 (45,55]
#> 9 qld 62 (55,65]
#> 10 vic 69 (65,75]
#> 11 nsw 70 (65,75]
#> 12 vic 42 (35,45]
#> 13 qld 56 (55,65]
#> 14 qld 61 (55,65]
#> 15 sa 61 (55,65]
#> 16 tas 61 (55,65]
#> 17 sa 58 (55,65]
#> 18 nt 51 (45,55]
#> 19 wa 48 (45,55]
#> 20 vic 65 (55,65]
#> 21 qld 49 (45,55]
#> 22 nsw 49 (45,55]
#> 23 nsw 41 (35,45]
#> 24 wa 48 (45,55]
#> 25 sa 52 (45,55]
#> 26 act 46 (45,55]
#> 27 nsw 59 (55,65]
#> 28 vic 46 (45,55]
#> 29 vic 58 (55,65]
#> 30 act 43 (35,45]
# sebuah list yang komponennya memenuhi syarat dapat diubah menjadi data frame
as.data.frame(list.ABC)
#> a b c d e
#> 1 1 2 tiga TRUE 1
#> 2 1 2 tiga TRUE 2
attach() membuat komponen list/data frame bisa diakses
langsung sebagai variabel tanpa notasi $. Karena objek
lentils pada buku hanya dijadikan contoh (bukan dataset
bawaan R), kita buat versi sederhananya sendiri agar kode dapat
dijalankan:
lentils <- data.frame(u = 1:5, v = 6:10, w = 11:15)
attach(lentils)
u
#> [1] 1 2 3 4 5
v
#> [1] 6 7 8 9 10
w
#> [1] 11 12 13 14 15
# assignment ini TIDAK mengubah komponen u pada data frame,
# melainkan membuat variabel u baru di posisi 1 search path
u <- v + w
u
#> [1] 17 19 21 23 25
# untuk mengubah data frame aslinya, gunakan notasi $
lentils$u <- v + w
lentils
#> u v w
#> 1 17 6 11
#> 2 19 7 12
#> 3 21 8 13
#> 4 23 9 14
#> 5 25 10 15
detach()
Bagian ini bersifat konseptual (alur kerja yang disarankan: kumpulkan
variabel dalam satu data frame, attach() saat
mengerjakannya, simpan perubahan dengan notasi $, lalu
detach() sebelum berpindah topik) — tidak ada kode baru
yang perlu dijalankan.
attach() bersifat generik dan dapat digunakan pada objek
list apa pun, tidak hanya data frame:
any.old.list <- list(p = 1:3, q = letters[1:3])
attach(any.old.list)
p
#> [1] 1 2 3
q
#> [1] "a" "b" "c"
detach(any.old.list)
Fungsi search() menunjukkan search path saat ini, dan
ls(2) menampilkan isi posisi ke-2 pada search path
tersebut.
search()
#> [1] ".GlobalEnv" "package:stats" "package:graphics"
#> [4] "package:grDevices" "package:utils" "package:datasets"
#> [7] "package:methods" "Autoloads" "package:base"
attach(lentils)
#> The following object is masked _by_ .GlobalEnv:
#>
#> u
search()
#> [1] ".GlobalEnv" "lentils" "package:stats"
#> [4] "package:graphics" "package:grDevices" "package:utils"
#> [7] "package:datasets" "package:methods" "Autoloads"
#> [10] "package:base"
ls(2)
#> [1] "u" "v" "w"
detach("lentils")
search()
#> [1] ".GlobalEnv" "package:stats" "package:graphics"
#> [4] "package:grDevices" "package:utils" "package:datasets"
#> [7] "package:methods" "Autoloads" "package:base"
read.table() digunakan untuk membaca data frame langsung
dari file eksternal. Berikut file contoh dibuat lebih dulu dengan
writeLines() agar proses baca-tulisnya dapat dicoba tanpa
perlu file eksternal terpisah.
Dengan label baris (row label) pada file:
teks_house <- " Price Floor Area Rooms Age Cent.heat
01 52.00 111.0 830 5 6.2 no
02 54.75 128.0 710 5 7.5 no
03 57.50 101.0 1000 5 4.2 no
04 57.50 131.0 690 6 8.8 no
05 59.75 93.0 900 5 1.9 yes"
writeLines(teks_house, "houses.data")
HousePrice <- read.table("houses.data")
HousePrice
#> Price Floor Area Rooms Age Cent.heat
#> 01 52.00 111 830 5 6.2 no
#> 02 54.75 128 710 5 7.5 no
#> 03 57.50 101 1000 5 4.2 no
#> 04 57.50 131 690 6 8.8 no
#> 05 59.75 93 900 5 1.9 yes
Tanpa label baris (menggunakan
header = TRUE):
teks_house2 <- "Price Floor Area Rooms Age Cent.heat
52.00 111.0 830 5 6.2 no
54.75 128.0 710 5 7.5 no
57.50 101.0 1000 5 4.2 no
57.50 131.0 690 6 8.8 no
59.75 93.0 900 5 1.9 yes"
writeLines(teks_house2, "houses2.data")
HousePrice2 <- read.table("houses2.data", header = TRUE)
HousePrice2
#> Price Floor Area Rooms Age Cent.heat
#> 1 52.00 111 830 5 6.2 no
#> 2 54.75 128 710 5 7.5 no
#> 3 57.50 101 1000 5 4.2 no
#> 4 57.50 131 690 6 8.8 no
#> 5 59.75 93 900 5 1.9 yes
scan() membaca beberapa vektor sekaligus (secara
paralel) dari sebuah file. Berikut contoh file input.dat
berisi tiga kolom: satu karakter dan dua numerik.
writeLines(c("A 10 20", "B 15 25", "C 12 22"), "input.dat")
# dummy list tanpa nama komponen
inp <- scan("input.dat", list("", 0, 0))
inp
#> [[1]]
#> [1] "A" "B" "C"
#>
#> [[2]]
#> [1] 10 15 12
#>
#> [[3]]
#> [1] 20 25 22
label <- inp[[1]]; x <- inp[[2]]; y <- inp[[3]]
label
#> [1] "A" "B" "C"
x
#> [1] 10 15 12
y
#> [1] 20 25 22
# dummy list dengan nama komponen (lebih praktis)
inp2 <- scan("input.dat", list(id = "", x = 0, y = 0))
inp2
#> $id
#> [1] "A" "B" "C"
#>
#> $x
#> [1] 10 15 12
#>
#> $y
#> [1] 20 25 22
label2 <- inp2$id; x2 <- inp2$x; y2 <- inp2$y
label2
#> [1] "A" "B" "C"
x2
#> [1] 10 15 12
y2
#> [1] 20 25 22
Jika argumen kedua berupa nilai tunggal (bukan list), maka hasilnya adalah satu vektor saja — berguna misalnya untuk membentuk matriks:
writeLines(as.character(rep(1:10, 5)), "light.dat")
X <- matrix(scan("light.dat", 0), ncol = 5, byrow = TRUE)
X
#> [,1] [,2] [,3] [,4] [,5]
#> [1,] 1 2 3 4 5
#> [2,] 6 7 8 9 10
#> [3,] 1 2 3 4 5
#> [4,] 6 7 8 9 10
#> [5,] 1 2 3 4 5
#> [6,] 6 7 8 9 10
#> [7,] 1 2 3 4 5
#> [8,] 6 7 8 9 10
#> [9,] 1 2 3 4 5
#> [10,] 6 7 8 9 10
R menyediakan sekitar 100 dataset bawaan (paket
datasets), dan paket lain juga dapat menyertakan dataset
tambahan.
# menampilkan daftar dataset yang tersedia
data()
# beberapa paket masih memakai cara lama untuk memuat dataset
data(infert)
head(infert)
#> education age parity induced case spontaneous stratum pooled.stratum
#> 1 0-5yrs 26 6 1 1 2 1 3
#> 2 0-5yrs 42 1 1 1 0 2 1
#> 3 0-5yrs 39 6 2 1 0 3 4
#> 4 0-5yrs 34 4 2 1 0 4 2
#> 5 6-11yrs 35 3 1 1 1 5 32
#> 6 6-11yrs 36 4 2 1 1 6 36
# melihat dataset yang tersedia pada paket tertentu
data(package = "rpart")
# memuat dataset tertentu dari paket tertentu
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
Fungsi edit() dan fix() membuka jendela
spreadsheet interaktif untuk mengedit data frame/matriks secara manual,
sehingga tidak dapat dijalankan otomatis saat proses
knit (non-interaktif). Kode berikut ditampilkan sebagai contoh
sesuai buku, dengan eval=FALSE:
# membuka editor, hasil edit disimpan ke objek baru
xnew <- edit(xold)
# mengubah dataset asli secara langsung
fix(xold) # setara dengan: xold <- edit(xold)
# membuat data baru dari editor kosong
xnew <- edit(data.frame())
Seluruh contoh kode pada Bab 6 (Lists and data frames) dan Bab 7
(Reading data from files) telah dicoba dan dijalankan di atas, kecuali
edit()/ fix() pada Bagian 7.4 yang memerlukan
sesi R interaktif.