向量
最后更新于:2022-04-01 02:43:51
# 向量
### 利用 c(...) 建立向量,但切記向量元素必須是同個資料屬性。
~~~
> c(1, 2, 3)
[1] 1 2 3
> c(1, TRUE, "test") # 全部都變成 character
[1] "1" "TRUE" "test"
> c(1.1, TRUE, "test") # 全部都變成 character
[1] "1.1" "TRUE" "test"
> c(1+2i, TRUE, "test") # 全部都變成 character
[1] "1+2i" "TRUE" "test"
> c(1, TRUE) # 全部自動轉成 integer
[1] 1 1
> c(1.1, TRUE) # 全部自動轉成 numeric
[1] 1.1 1.0
> c(1+2i, TRUE) # 全部自動轉成 complex
[1] 1+2i 1+0i
> c(1, 1.1) # 全部自動轉成 integer
[1] 1.0 1.1
> c(1, 1.1, 1+2i) # 全部自動轉成 complex
[1] 1.0+0i 1.1+0i 1.0+2i
~~~
註:經由以上比較後,可以得到當放入的形態不同時,會被轉成同一形態,且可以每個形態的強弱不同,以下是強到弱排序。
character > complex > numeric > integer > logical
### 透過指標與名稱提取資料
我們可以透過以下二種方式取得向量元素。
- 指標
- 元素名稱
另外可以搭配 [] 或 [[]],這樣分別會回傳向量元素的所有資訊或向量元素的數值,總共可以分成以下四種狀況。
- x[i]:回傳向量元素所有資訊
- x[[i]]:只回傳向量元素的值
- x[元素名稱]:回傳向量元素所有資訊
- x[元素名稱]:只回傳向量元素的值
~~~
> x <- c(joe=12, vicky=14, bob=17)
> x[1]
joe
12
> x[[1]]
[1] 12
> x["joe"]
joe
12
> x[["joe"]]
[1] 12
> x[1]
joe
12
> x[[1]]
[1] 12
> x[1:2] # 一次取多個向量元素
joe vicky
12 14
~~~
### c(...) 類似的函數 x:y、seq 與 rep
- x:y:回傳 x 到 y 的整數向量,所以 x 與 y 都是整數。
- seq(s, e, by):產生一個等差級數的向量。
- s 是初始值
- e 是結束值
- by 是遞增值,預設是 1
- rep(x, times, each):產生一個重覆循環的向量。
- x 是需重覆循環的數值
- times 是重覆循環次數
- each 是 x 內元素重覆的次數
~~~
> 1:5
[1] 1 2 3 4 5
> seq(1, 5)
[1] 1 2 3 4 5
> seq(1, 5, 0.3) # 就算沒有剛好加到跟結束值一樣也沒關係
[1] 1.0 1.3 1.6 1.9 2.2 2.5 2.8 3.1 3.4 3.7 4.0 4.3 4.6 4.9
> rep(c(1, 2, 3), times = 3, each = 2)
[1] 1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3
> rep(1:4, times = 3, each = 2)
[1] 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4
~~~
### 基本相關函數
- 向量加減乘除
- length:計算向量中的元素個數。
- sum:將向量所有元素加總。
- prod:將向量所有元素相乘。
- cumsum:回傳元素累加向量。
- cumprod:回傳元素累乘向量。
- sort:將向量元素排列,產生排序過的向量。
- rank:回傳各向量元素的排序值。
~~~
> c(3, 4, 2) + c(3, 4, 2)
[1] 6 8 4
> c(3, 4, 2) - c(3, 4, 2)
[1] 0 0 0
> c(3, 4, 2) * c(3, 4, 2)
[1] 9 16 4
> c(3, 4, 2) / c(3, 4, 2)
[1] 1 1 1
> length(c(3, 4, 2))
[1] 3
> sum(c(3, 4, 2))
[1] 9
> cumsum(c(3, 4, 2))
[1] 3 7 9
> cumprod(c(3, 4, 2))
[1] 3 12 24
> prod(c(3, 4, 2))
[1] 24
> sort(c(3, 4, 2))
[1] 2 3 4
> rank(c(3, 4, 2))
[1] 2 3 1
~~~
上述向量加減乘除時,向量個數都是一樣的狀況,但不同的狀況會發生什麼結果,請看以下測試。
### 加跟減
如果長度較長的向量長度是較短的倍數的話是可以相加或相減的。
~~~
> c(1, 2) + c(1, 2, 3)
[1] 2 4 4
警告訊息:
In c(1, 2) + c(1, 2, 3) : 較長的物件長度並非較短物件長度的倍數
> c(1, 2) + c(1, 2, 3, 4) # 1+1 2+2 1+3 1+4
[1] 2 4 4 6
~~~
### 乘跟除
乘跟除的情況與加跟減狀況一致,只是當長度不是倍數時會有結果但也會警告。
~~~
> c(1, 2) * c(1, 2, 3) # 1*1 2*2 1*3
[1] 1 4 3
警告訊息:
In c(1, 2) * c(1, 2, 3) : 較長的物件長度並非較短物件長度的倍數
> c(1, 2) * c(1, 2, 3, 4) # 1*1 2*2 1*3 2*4
[1] 1 4 3 8
~~~