R 學習日誌#3 - 資料結構 (向量 Vector、矩陣 Matrix、陣列 Array) 的區別與基本運算

在使用資料做統計分析之前,需要先了解 R 語言支援資料類型的語法技巧。在這個章節裡面惠介紹到向量 Vector、矩陣 Matrix、陣列 Array 用法,以及基本運算的寫法。

  • 向量 Vector
  • 矩陣 Matrix
  • 陣列 Array
  • 向量、矩陣、陣列的區別

向量 Vector

  • 向量 (vector) 的第一個指標是 1,取值要用 [] 中括號
1
2
3
4
5
6
7
8
9
10
# 向量表示法
> x <- c(5, 32, 56)
> x
[1] 5 32 56

# 取其中一筆
> x <- c(5, 32, 56)
> x[2]

結果: [1] 32
  • (…) 把運算式用括弧刮起來,可以強制的顯示執行結果
1
2
3
> (a <- 2 + 3)

結果:[1] 5
  • 物件的自動循環,也就是說在運算的時候會對長度較短的數字或向量做重複循環
1
2
3
4
5
> x <- c(4, 3, 7, 8)
> x + 4

結果:[1] 8 7 11 12
說明:相當於 c(4, 3, 7, 8) + c(4, 4, 4, 4)

矩陣 Matrix

相同資料類型依照行 (Row) 與列 (Column) 的組合就形成了矩陣,屬於二維資料結構。使用 matrix() 函數建立矩陣

1
2
3
4
> m <- matrix(data <- NA, nrow = 1, ncol = 3, byrow = FALSE)
> m
[,1] [,2] [,3]
[1,] NA NA NA
  • data: 資料
  • nrow: 行數
  • ncol: 列數
  • byrow: 預設是照列排序下來,如果想以行排列的話可以這麼寫,看一下以下例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 這是 byrow = FALSE
> mdata <- c(1,2,3,4,5,6)
> m <- matrix(data <- mdata, nrow = 2, ncol = 3, byrow = FALSE)
> m
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6

# 這是 byrow = TRUE
> m <- matrix(data = mdata, nrow = 2, ncol = 3, byrow = TRUE)
> m
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6

矩陣的索引

建立矩陣之後可以透過 [] 來索引矩陣的元素,從上面的例子來看,我們想找第二行的資料,如下:

1
2
3
4
5
6
7
8
> m <- matrix(data = mdata, nrow = 2, ncol = 3, byrow = TRUE)
> m
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6

> m[2, ]
[1] 4 5 6

也就是透過 m[2, ] 來找到第二行資料,那麼若要找 第三列的資料,應該也難不倒你的,如下:

1
2
3
4
5
6
7
> m <- matrix(data = mdata, nrow = 2, ncol = 3, byrow = TRUE)
> m
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
> m[, 3]
[1] 3 6

嗯嗯,就是反過來寫成 m[, 3] 就可以了。當然你也可以多行或多烈的方式列出,此時會透過 c 向量來做到這個問題,如下:

1
2
3
4
5
6
7
8
9
10
# 這個例子是找第一行跟第三行
> m <- matrix(data = mdata, nrow = 2, ncol = 3, byrow = TRUE)
> m
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
> m[, c(1,3)]
[,1] [,2]
[1,] 1 3
[2,] 4 6

反之,若要找第一列跟第二列的那就 m[c(1,2),] 就可以囉

陣列 Array

陣列用 array() 建立,以下透過 array() 函數產生 3 x 3 x 2 的三維陣列,每個維度加上標籤,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
> dim1 <- c('a1', 'a2', 'a3')
> dim2 <- c('b1', 'b2', 'b3')
> dim3 <- c('c1', 'c2')
> arr <- array(1:18, c(3,3,2), dimnames = list(dim1, dim2, dim3))
> arr
, , c1

b1 b2 b3
a1 1 4 7
a2 2 5 8
a3 3 6 9

, , c2

b1 b2 b3
a1 10 13 16
a2 11 14 17
a3 12 15 18

向量、矩陣、陣列的區別

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
> # 建立向量
> x <- c(5, 32, 56)
> x
[1] 5 32 56


> # 建立矩陣
> y <- matrix(1:6, nrow = 2)
> y
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6


> # 建立陣列
> z <- array(c(2:8), 4)
> z
[1] 2 3 4 5

基本運算方式

運算次序:括號 > 指數 > 乘法 > 除法 > 加減法

  • 基礎運算
1
2
3
4
5
6
> 1 + 2   # 加法, 結果: [1] 3
> 1 / 2 # 除法
> 1 %/% 2 # 整除
> 9 %% 2 # 取餘數
> 2 ^ 0.5 # 冪次運算
> cos(1.0) # 三角函數運算
  • 有序數列
1
2
3
4
5
> 1:5  # 結果: [1] 1 2 3 4 5
> 1.5:6 # 結果: [1] 1.5 2.5 3.5 4.5 5.5
> c(2.4:10, 5) # 結果: [1] 2.4 3.4 4.4 5.4 6.4 7.4 8.4 9.4 5.0
> prod(1:6) # 結果: [1] 720 屬於階乘函數
> seq(1, 9) # 結果: [1] 1 2 3 4 5 6 7 8 9