Bagian 3 Operasi Dasar R
3.1 Akses Elemen
Ada tiga operator yang dapat digunakan untuk mengekstrak/mengakses elemen atau bagian dari objek R.
Operator
[ ]selalu mengembalikan objek dari kelas yang sama dengan aslinya. Dapat digunakan untuk memilih satu atau beberapa elemen dari suatu objek.Operator
[[ ]]digunakan untuk mengekstrak elemen dari list atau dataframe. Hanya dapat digunakan untukmengekstrak satu elemen dan kelas objek yang dikembalikan tidak harus sama seperti objek awalnya.Operator
$digunakan untuk mengekstrak elemen list atau dataframe melalui namanya. Secara semantik, ini mirip dengan operator[[ ]].
3.1.1 Akses elemen vector
Elemen vector dapat diekstrak dengan memasukkan nomor urut elemen ke dalam operator [ ]. Elemen dari vektor dan objek R lainnya, dimulai dari `.
x <- c("a", "b", "c", "c", "d", "a") Mengakses elemen pertama
x[1]## [1] "a"
Mengakses elemen ke-2
x[2]## [1] "b"
Mengakses semua elemen kecuali elemen ke-2
x[-2]## [1] "a" "c" "c" "d" "a"
Jika vector sudah mempunyai nama, dapat diakses menggunakan namanya
y <- 1:3
names(y) <- c("New York", "Seattle", "Los Angeles")
y["Seattle"]## Seattle
## 2
Operator [ ] dapat digunakan untuk mengakses beberapa elemen sekaligus, misalnya untuk mengekstrak element pertama sampai ke-4
x[1:4]## [1] "a" "b" "c" "c"
Mengkases elemen ke-1, ke-2 dan ke-4
x[c(1,2,4)]## [1] "a" "b" "c"
Selain dengan integer, memilih elemen juga bisa menggunakan logical. Misalnya untuk memilih elemen bukan “a”
u <- x != "a"
u## [1] FALSE TRUE TRUE TRUE TRUE FALSE
x[u]## [1] "b" "c" "c" "d"
Atau dapat diringkas
x[x != "a"]## [1] "b" "c" "c" "d"
3.1.2 Akses elemen matriks
Sepertihalnya vector, akses terhadap elemen matriks dapat dilakukan dengan operator [ ] dengan memasukkan posisi baris dan kolom dengan format [row, col]. Sehingga apabila akan mengambil elemen di baris ke-2 kolom ke-1 dan baris ke-1 kolom ke-3 dapat kita tuliskan:
x <- matrix(1:6, 2, 3)
x## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
x[2,1] # baris ke-2 kolom ke-1## [1] 2
x[1,3] # baris ke-1 kolom ke-3## [1] 5
Atau untuk mengekstrak seluruh kolom atau baris tertentu
x[2,] # ekstrak baris ke-2## [1] 2 4 6
x[,3] # ekstrak kolom ke-3## [1] 5 6
3.1.3 Akses elemen list
Elemen dari list dapat diakses dengan menggunakan tiga operator di atas dengan tujuan yang berbeda-beda.
x <- list(foo = 1:4, bar = 0.6, foobar = c("a","b","c"))
x## $foo
## [1] 1 2 3 4
##
## $bar
## [1] 0.6
##
## $foobar
## [1] "a" "b" "c"
Akses list dengan [ ] sama seperti vektor
x[1] # elemen pertama## $foo
## [1] 1 2 3 4
x[1:2] # elemen pertama dan kedua## $foo
## [1] 1 2 3 4
##
## $bar
## [1] 0.6
Untuk akses elemen tunggal, dapat menggunakan operator [[ ]]
x[[2]] # akses elemen ke-2## [1] 0.6
x[["bar"]] # akses elemen yang bernama "bar"## [1] 0.6
Untuk mengakses elemen dalam elemen:
x[[3]][[1]]## [1] "a"
Atau menggunakan operator $
x$bar## [1] 0.6
x$data## NULL
Perhatikan tidak ada elemen bernama “data,” sehingga R mengembalikan “NULL,” bukan error.
3.1.4 Akses elemen dataframe
Akses elemen data frame mirip seperti matriks dengan menggunakan operator [ ]
df <- data.frame(numbers = c(10, 20, 30, 40),
text = c("a", "b", "c", "a"),
logic = c(T, F, T, F))
df## numbers text logic
## 1 10 a TRUE
## 2 20 b FALSE
## 3 30 c TRUE
## 4 40 a FALSE
df[1,2] # baris pertama kolom ke-2## [1] "a"
df[1,] # baris pertama## numbers text logic
## 1 10 a TRUE
df[,2] # kolom ke-2## [1] "a" "b" "c" "a"
df[df[1] < 30, ] # semua kolom dan semua baris yang lebih kecil dari 20## numbers text logic
## 1 10 a TRUE
## 2 20 b FALSE
Atau dengan operator [[ ]]
df[[2]] # kolom ke-2## [1] "a" "b" "c" "a"
df[["text"]] # kolom "text"## [1] "a" "b" "c" "a"
Atau dengan operator $
df$text## [1] "a" "b" "c" "a"
3.2 Operasi aritmatika dasar
3.2.1 Menampilkan atribut
Objek R biasanya mempunyai atribut, seperti
names, dimnames
dimensions
class (e.g. integer, numeric)
length
dan lain-lain
Misalnya kita mempunyai data frame
df <- data.frame(numbers = c(10, 20, 30, 40),
text = c("a", "b", "c", "a"),
logic = c(T, F, T, F))names(df) # nama dari kolom## [1] "numbers" "text" "logic"
dim(df) # dimensi dari df## [1] 4 3
nrow(df) # jumlah kolom## [1] 4
ncol(df) # jumlah kolom## [1] 3
class(df) # class objek## [1] "data.frame"
x <- df[[1]]
length(x) # jumlah elemen## [1] 4
Untuk mengetahui atribut apasaja yang ada data objek kita, dapat menggunakan perintah attributes().
attributes(df)## $names
## [1] "numbers" "text" "logic"
##
## $class
## [1] "data.frame"
##
## $row.names
## [1] 1 2 3 4
3.2.2 Operasi pada vector
Operasi-operasi pada vector dilakukan secara element by element (elementwise). Misalnya
x <- c(1:10)
y <- c(11:20)
x + y## [1] 12 14 16 18 20 22 24 26 28 30
Maka elemen pertama dari x akan dijumlahkan dengan elemen pertama dari y, elemen ke-2 dari x akan dijumlahkan dengan elemen ke-2 dari y, dan seterusnya.
Jika vector-vector yang dioperasikan memiliki panjang berbeda, maka berlalu aturan recycling, yaitu vektor dengan elemen sedikit akan diulang mengikuti vektor yang memiliki elemen paling banyak. Contoh
x <- c(1:10)
y <- c(11:18)
x + y## Warning in x + y: longer object length is not a multiple of shorter object
## length
## [1] 12 14 16 18 20 22 24 26 20 22
Objek x mempunyai 10 elemen sedangkan y hanya ada 8. Untuk penjumlahan elemen 1 sd. 8, berlaku normal seperti contoh sebelumnya, sedangkan untuk elemen 9 dan 10 menggunakan aturan recycling. Dalam hal ini, R akan me-recycle elemen pertama dan ke-2 dari y sebagai objek “pengganti” bagi elemen ke-9 dan 10.
3.2.2.1 Operasi sederhana vector numerik
R mengenal banyak sekali operasi numerik, seperti
+ - * /: Penjumlahan, pengurangan, perkalian, pembagian%%: Modulus%/%: Pembagian integer%*%: Perkalian matriks setarax'x%o%: Perkalian matriks setaraxx'< <= > >= == !=: Operasi logika/perbandingan
Contoh
x <- c(1:10)
y <- c(11:20)
x + y # penjumlah## [1] 12 14 16 18 20 22 24 26 28 30
x < y # logical## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
y %% 3 # modulus## [1] 2 0 1 2 0 1 2 0 1 2
y %/% 3 # pembagian integral## [1] 3 4 4 4 5 5 5 6 6 6
x %*% y # Perkalian matriks setara `x'x`## [,1]
## [1,] 935
x %o% y # Perkalian matriks setara `xx'`## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 11 12 13 14 15 16 17 18 19 20
## [2,] 22 24 26 28 30 32 34 36 38 40
## [3,] 33 36 39 42 45 48 51 54 57 60
## [4,] 44 48 52 56 60 64 68 72 76 80
## [5,] 55 60 65 70 75 80 85 90 95 100
## [6,] 66 72 78 84 90 96 102 108 114 120
## [7,] 77 84 91 98 105 112 119 126 133 140
## [8,] 88 96 104 112 120 128 136 144 152 160
## [9,] 99 108 117 126 135 144 153 162 171 180
## [10,] 110 120 130 140 150 160 170 180 190 200
3.2.2.2 Operasi sederhana vector karakter
R juga mempunyai banyak fungsi untuk operasi terhadap vektor karakter, beberapa diantaranya
nchar(): Menghitung panjang karakterpaste(): Menggabungkan elemensubstr(): Mengambil bagian dari teks berdasarkan posisi tertentu
Contoh:
y <- c("Institut", "Pertanian", "Bogor", "IPB")
nchar(y) # menghitung panjang karakter## [1] 8 9 5 3
paste(y, collapse = " ") # menggabungkan elemen## [1] "Institut Pertanian Bogor IPB"
paste(y, "ku", sep = "") # menggabungkan dengan vektor lain## [1] "Institutku" "Pertanianku" "Bogorku" "IPBku"
substr(y, 1, 3) # mengambil huruf pertama sampai huruf ke-3## [1] "Ins" "Per" "Bog" "IPB"
3.3 Operasi pada matriks
R dilengkapi banyak fungsi untuk matriks. Beberapa diataranya:
* * : Perkalain element by element
* t() : Transpose
* %*% : Perkalian matriks setara x'x
* %o% : Perkalian matriks setara xx'
* solve() : Menghitung matriks inverse
* eigen() : Menghitung eigen value dan eigen vector
Contoh
Z1 <- matrix(1:6,2,3)
Z2 <- matrix(1:6,3,2,byrow=T)
Z3 <- matrix(6:9,2,2)
Z4 <- Z1 %*% Z2
Z4## [,1] [,2]
## [1,] 35 44
## [2,] 44 56
Z1 %o% Z2## , , 1, 1
##
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
##
## , , 2, 1
##
## [,1] [,2] [,3]
## [1,] 3 9 15
## [2,] 6 12 18
##
## , , 3, 1
##
## [,1] [,2] [,3]
## [1,] 5 15 25
## [2,] 10 20 30
##
## , , 1, 2
##
## [,1] [,2] [,3]
## [1,] 2 6 10
## [2,] 4 8 12
##
## , , 2, 2
##
## [,1] [,2] [,3]
## [1,] 4 12 20
## [2,] 8 16 24
##
## , , 3, 2
##
## [,1] [,2] [,3]
## [1,] 6 18 30
## [2,] 12 24 36
Z3 * Z4## [,1] [,2]
## [1,] 210 352
## [2,] 308 504
invZ <- solve(Z4) # invers
invZ## [,1] [,2]
## [1,] 2.333333 -1.833333
## [2,] -1.833333 1.458333
invZ %*% Z4 # matriks identitas## [,1] [,2]
## [1,] 1 2.842171e-14
## [2,] 0 1.000000e+00
h <- c(5,11)
p <- solve(Z4,h) #solusi persamaan linear Zp=h
e <- eigen(Z4) #eigen value & eigen vector dr Z4
e$values #akses eigen values## [1] 90.7354949 0.2645051
e[[2]] #akses eigen vectors## [,1] [,2]
## [1,] 0.6196295 -0.7848945
## [2,] 0.7848945 0.6196295
3.4 Latihan
3.4.1 Latihan 1
Tentukan output syntax program berikut:
c("la","ye")[rep(c(1,2,2,1),times=4)]
c("la","ye")[rep(rep(1:2,each=3),2)]Jawab:
c("la","ye")[rep(c(1,2,2,1),times=4)]## [1] "la" "ye" "ye" "la" "la" "ye" "ye" "la" "la" "ye" "ye" "la" "la" "ye" "ye"
## [16] "la"
c("la","ye")[rep(rep(1:2,each=3),2)]## [1] "la" "la" "la" "ye" "ye" "ye" "la" "la" "la" "ye" "ye" "ye"
3.4.2 Latihan 2
Buatlah syntax agar dihasilkan output vektor sebagai berikut
X1 Y2 X3 Y4 X5 Y6 X7 Y8 X9 Y10
1 4 7 10 13 16 19 22 25 283.4.3 Latihan 3
Seorang peneliti merancang sebuah perancangan percobaan RAKL dengan 4 perlakuan dan 3 kelompok (anggaplah respon percobaan berupa baris bilangan). Bantulah peneliti tersebut untuk membuat raw data seperti output sebagai berikut!
> data1
Perl Kel Resp
1 P1 1 1
2 P1 2 3
3 P1 3 5
4 P2 1 7
5 P2 2 9
6 P2 3 11
7 P3 1 13
8 P3 2 15
9 P3 3 17
10 P4 1 19
11 P4 2 21
12 P4 3 23
Jawab
jPerl <- 4
jKel <- 3
Perl <- factor(rep(paste0("P", c(1:jPerl)), each = jKel))
Kel <- factor(rep(1:jKel, jPerl))
Resp <- 2*seq(jPerl*jKel) - 1
data1 <- data.frame(Perl, Kel, Resp)
data1## Perl Kel Resp
## 1 P1 1 1
## 2 P1 2 3
## 3 P1 3 5
## 4 P2 1 7
## 5 P2 2 9
## 6 P2 3 11
## 7 P3 1 13
## 8 P3 2 15
## 9 P3 3 17
## 10 P4 1 19
## 11 P4 2 21
## 12 P4 3 23
Atau bisa dibuat fungsi sebagai berikut
genRancob <- function(jPerl = 4, jKel = 3){
Perl <-factor(rep(paste0("P", c(1:jPerl)), each = jKel))
Kel <- factor(rep(1:jKel, jPerl))
Resp <- 2*seq(jPerl*jKel) - 1
data1 <- data.frame(Perl, Kel, Resp)
return(data1)
}
data1 <- genRancob(jPerl = 4, jKel = 3)
data1