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 `.
<- c("a", "b", "c", "c", "d", "a") x
Mengakses elemen pertama
1] x[
## [1] "a"
Mengakses elemen ke-2
2] x[
## [1] "b"
Mengakses semua elemen kecuali elemen ke-2
-2] x[
## [1] "a" "c" "c" "d" "a"
Jika vector sudah mempunyai nama, dapat diakses menggunakan namanya
<- 1:3
y names(y) <- c("New York", "Seattle", "Los Angeles")
"Seattle"] y[
## Seattle
## 2
Operator [ ]
dapat digunakan untuk mengakses beberapa elemen sekaligus, misalnya untuk mengekstrak element pertama sampai ke-4
1:4] x[
## [1] "a" "b" "c" "c"
Mengkases elemen ke-1, ke-2 dan ke-4
c(1,2,4)] x[
## [1] "a" "b" "c"
Selain dengan integer, memilih elemen juga bisa menggunakan logical. Misalnya untuk memilih elemen bukan “a”
<- x != "a"
u u
## [1] FALSE TRUE TRUE TRUE TRUE FALSE
x[u]
## [1] "b" "c" "c" "d"
Atau dapat diringkas
!= "a"] x[x
## [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:
<- matrix(1:6, 2, 3)
x x
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
2,1] # baris ke-2 kolom ke-1 x[
## [1] 2
1,3] # baris ke-1 kolom ke-3 x[
## [1] 5
Atau untuk mengekstrak seluruh kolom atau baris tertentu
2,] # ekstrak baris ke-2 x[
## [1] 2 4 6
3] # ekstrak kolom ke-3 x[,
## [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.
<- list(foo = 1:4, bar = 0.6, foobar = c("a","b","c"))
x x
## $foo
## [1] 1 2 3 4
##
## $bar
## [1] 0.6
##
## $foobar
## [1] "a" "b" "c"
Akses list dengan [ ]
sama seperti vektor
1] # elemen pertama x[
## $foo
## [1] 1 2 3 4
1:2] # elemen pertama dan kedua x[
## $foo
## [1] 1 2 3 4
##
## $bar
## [1] 0.6
Untuk akses elemen tunggal, dapat menggunakan operator [[ ]]
2]] # akses elemen ke-2 x[[
## [1] 0.6
"bar"]] # akses elemen yang bernama "bar" x[[
## [1] 0.6
Untuk mengakses elemen dalam elemen:
3]][[1]] x[[
## [1] "a"
Atau menggunakan operator $
$bar x
## [1] 0.6
$data x
## 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 [ ]
<- data.frame(numbers = c(10, 20, 30, 40),
df 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
1,2] # baris pertama kolom ke-2 df[
## [1] "a"
1,] # baris pertama df[
## numbers text logic
## 1 10 a TRUE
2] # kolom ke-2 df[,
## [1] "a" "b" "c" "a"
1] < 30, ] # semua kolom dan semua baris yang lebih kecil dari 20 df[df[
## numbers text logic
## 1 10 a TRUE
## 2 20 b FALSE
Atau dengan operator [[ ]]
2]] # kolom ke-2 df[[
## [1] "a" "b" "c" "a"
"text"]] # kolom "text" df[[
## [1] "a" "b" "c" "a"
Atau dengan operator $
$text df
## [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
<- data.frame(numbers = c(10, 20, 30, 40),
df 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"
<- df[[1]]
x 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
<- c(1:10)
x <- c(11:20)
y
+ y x
## [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
<- c(1:10)
x <- c(11:18)
y
+ y x
## 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
<- c(1:10)
x <- c(11:20)
y
+ y # penjumlah x
## [1] 12 14 16 18 20 22 24 26 28 30
< y # logical x
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
%% 3 # modulus y
## [1] 2 0 1 2 0 1 2 0 1 2
%/% 3 # pembagian integral y
## [1] 3 4 4 4 5 5 5 6 6 6
%*% y # Perkalian matriks setara `x'x` x
## [,1]
## [1,] 935
%o% y # Perkalian matriks setara `xx'` x
## [,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:
<- c("Institut", "Pertanian", "Bogor", "IPB")
y
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
<- matrix(1:6,2,3)
Z1 <- matrix(1:6,3,2,byrow=T)
Z2 <- matrix(6:9,2,2)
Z3
<- Z1 %*% Z2
Z4 Z4
## [,1] [,2]
## [1,] 35 44
## [2,] 44 56
%o% Z2 Z1
## , , 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
* Z4 Z3
## [,1] [,2]
## [1,] 210 352
## [2,] 308 504
<- solve(Z4) # invers
invZ invZ
## [,1] [,2]
## [1,] 2.333333 -1.833333
## [2,] -1.833333 1.458333
%*% Z4 # matriks identitas invZ
## [,1] [,2]
## [1,] 1 2.842171e-14
## [2,] 0 1.000000e+00
<- c(5,11)
h <- solve(Z4,h) #solusi persamaan linear Zp=h
p
<- eigen(Z4) #eigen value & eigen vector dr Z4
e $values #akses eigen values e
## [1] 90.7354949 0.2645051
2]] #akses eigen vectors e[[
## [,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 Y101 4 7 10 13 16 19 22 25 28
3.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
<- 4
jPerl <- 3
jKel <- factor(rep(paste0("P", c(1:jPerl)), each = jKel))
Perl <- factor(rep(1:jKel, jPerl))
Kel <- 2*seq(jPerl*jKel) - 1
Resp <- data.frame(Perl, Kel, Resp)
data1 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
<- function(jPerl = 4, jKel = 3){
genRancob <-factor(rep(paste0("P", c(1:jPerl)), each = jKel))
Perl <- factor(rep(1:jKel, jPerl))
Kel <- 2*seq(jPerl*jKel) - 1
Resp <- data.frame(Perl, Kel, Resp)
data1 return(data1)
}
<- genRancob(jPerl = 4, jKel = 3)
data1 data1