1 Pendahuluan

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).

2 Bab 6 — Lists and Data Frames

2.1 Data pendukung dari Bab 4 & 5

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)))

2.2 6.1 Lists

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"

2.3 6.2 Constructing and modifying lists

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

2.3.1 6.2.1 Concatenating lists

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

2.4 6.3 Data frames

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.

2.4.1 6.3.1 Making data frames

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

2.4.2 6.3.2 attach() dan detach()

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()

2.4.3 6.3.3 Working with data frames

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.

2.4.4 6.3.4 Attaching arbitrary lists

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)

2.4.5 6.3.5 Managing the search path

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"

3 Bab 7 — Reading Data from Files

3.1 7.1 Fungsi read.table()

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

3.2 7.2 Fungsi scan()

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

3.3 7.3 Accessing builtin datasets

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

3.3.1 7.3.1 Loading data from other R packages

# 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

3.4 7.4 Editing data

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())

4 Kesimpulan

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.