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 setara x'x
  • %o% : Perkalian matriks setara xx'
  • < <= > >= == != : 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 karakter
  • paste() : Menggabungkan elemen
  • substr() : 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 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

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