---
disqus: ahb0222
GA : G-CQ4L16KHK4
---
R 語言_向量物件
===
> [color=#40f1ef][name=LHB阿好伯, Jan 26, 2019 10:05 PM][:earth_africa:](https://www.facebook.com/LHB0222/)
###### tags: `R`
[TOC]
# 有序數列
==:== 序列符號( Sequence )
---
從起始值到最終值,每次遞增1 , 如果是負值則每次增加-1
```R=
x <- 1:10
x
#[1] 1 2 3 4 5 6 7 8 9 10
y <- -1:10
y
#[1] -1 -2 -3 -4 -5 -6 -7 -8 -9 -10
```
起始值不一定要是整數
若是小數一樣會產生 1 為間距增減的向量直到最終值前的最大數值
```R=+
x <- 1.1 : 10.1
x
#[1] 1.1 2.1 3.1 4.1 5.1 6.1 7.1 8.1 9.1 10.1
y <- 1.1 : 9.9
y
#[1] 1.1 2.1 3.1 4.1 5.1 6.1 7.1 8.1 9.1
```
生成定序列seq()
---
這個函數可用於建立一個規則型的數值向量物件
seq(from = 1, to = 1, by = ((to - from)/(length.out - 1)),length.out = NULL, along.with = NULL, ...)
#生成定序列
from = 1 起始數值
to = 3 最終數值
by = 1 序列的增量
Length.out = 10 序列期望的長度
along.with = 依參數的長度取長度
``` R=
seq(1, 10) #建立1到10數列
# [1] 1 2 3 4 5 6 7 8 9 10
seq(1, 10, by = 2) #建立1到10間隔2的數列
# [1] 1 3 5 7 9
seq(1, 9, length.out = 5) 建立1到9共5個元素的數列
# [1] 1 3 5 7 9
```
連接向量物件 c() 函數
---
c() 函數的c其意義為concatenate 的縮寫
這個函數並不是一個建立向量物件函數數
而是將向量元素連接起來成為一個新向量
可以利用c()建立一個簡單向量物件
不同物件間以逗號隔開,
下面示範一個簡單範例
將五個元素組合成一個物件
``` R=
x <- c(1, 7, 12, 17, 21)
x
#[1] 1 7 12 17 21
```
也可以將兩個向量物件組合再一起
``` R=+
x <- c(1, 7, 12, 17, 21)
y <- seq(1, 10, by = 2)
z = c(x, y)
z
# [1] 1 7 12 17 21 1 3 5 7 9
```
重復向量物件rep( )
---
向量物件內某些元素是重複的
則可以使用rep( )函數建立這類型的向量物件
rep(x, times = 重複灰數, each = 每次每個元素重複次數, length.out =向量長度)
如果rep( )函數內只含有x 和times 參數,則"times ="參數可省略
``` R=
rep(5, 5) #重復物件 5 共5次
# [1] 5 5 5 5 5
rep(1:5, 3) #重復1:5共3次
# [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
rep(1:5, each = 2, length.out = 10 )#重復1:4,每個元素出現5次,生成向量長度10
#[1] 1 1 2 2 3 3 4 4 5 5
```
建立空向量numeric( )函數
---
可用此建立個固定長度的向量物件
同時向量物件元素預設值是0
```R=
x <- numeric(10)
x
# [1] 0 0 0 0 0 0 0 0 0 0
```
建立亂數 sample()
---
:::danger
sample(x, size, replace = FALSE, prob = NULL)
:::
``` R=
sample(100,20) #在0~100的範圍內亂數產生20個值
sample(1:10) #亂數排序1到10
```
## 分布
### 正態分布
:::danger
rnorm(n,mean,var)
:::
``` R=
rnorm(100,10, 1) #生成100筆平均為10,標準差為1的數據
barplot(rnorm(100,10, 1))
hist(rnorm(100,10, 1))
```
:::success
![](https://i.imgur.com/VleZloV.png)
![](https://i.imgur.com/FtTNDtx.png)
:::
### 均勻分布
:::danger
runif(n, min, max)
:::
``` R=
runif(100,min = 1, max = 100)
barplot(runif(100,min = 1, max = 100))
matl = matrix(c(1:6),2,3) #版面配置
layout(matl)
hist(runif(10,min = 1, max = 100))
hist(runif(100,min = 1, max = 100))
hist(runif(1000,min = 1, max = 100))
hist(runif(10000,min = 1, max = 100))
hist(runif(100000,min = 1, max = 100))
hist(runif(1000000,min = 1, max = 100))
```
:::success
![](https://i.imgur.com/03h1FCT.png)
:::
# 向量運算
分享至此,如果你學過其他高階電腦語言
你會發現向量物件變數有別於一般電腦程式語言的變數
是一種新的思維,同時如果你了解接下來向量的數學運算函數後
你將發現為何R 這麼受到歡迎
常見運算
---
sum() : 計算所有元素的和
max() :計算所有元素的最大值
min() :計算所有元素的最小值
mean() :計算所有元素的平均值
prod() :計算所有元素的積
```R=
x <- sample(100,20)
x
# [1] 56 59 97 30 98 68 55 43 73 1 82 42 37 86 7 41 47 36 89 61
sum(x) #計算所有元素的和
# [1] 1108
max(x) #算所有元素的最大值
# [1] 98
min(x) #計算所有元素的最小值
# [1] 1
mean(x) #計算所有元素的平均值
# [1] 55.4
prod(1:10) #計算1到10的積
# [1] 3628800
```
累積運算函數
---
cumsum() :計算所有元素的累積和
cumprod() :計算所有元素的累積積
cummax() :可返回各元素從向量起點到該元素位置所有元素的最大值
cummin() : 可返回各元素從向量起點到該元素位置所有元素的最小值
```R=
x <- sample(100,10)
x
# [1] 99 60 48 55 75 64 10 21 8 67
cumsum(x) #計算所有元素的累積和
# [1] 99 159 207 262 337 401 411 432 440 507
cumprod(x) #計算所有元素的累積積
# [1] 9.900000e+01 5.940000e+03 2.851200e+05
[4] 1.568160e+07 1.176120e+09 7.527168e+10
[7] 7.527168e+11 1.580705e+13 1.264564e+14
[10] 8.472580e+15
cummax(x) #可返回各元素從向量起點到該元素位置所有元素的最大值
# [1] 99 99 99 99 99 99 99 99 99 99
cummin(x) #可返回各元素從向量起點到該元素位置所有元素的最小值
# [1] 99 60 48 48 48 48 10 10 8 8
```
向量差值運算函數
---
diff() : 返回各元素與下一個元素的差
由於是傳回每筆與下一筆的差值
所以結果向量物件會比原先向量少一個元素
```R=
x <- sample(100,10)
x
# [1] 9 81 32 34 15 40 61 79 7 41
diff(x)
# [1] 72 -49 2 -19 25 21 18 -72 34
```
向量物件排序函數
---
sort(x , decreasing = FALSE) : 預設是從小排到大, 所以預設可以省略寫decreasing參數。如果設定"decreasing = TRUE" ,則是從大排到小。
rank( ) : 傳回向量物件,這個向量內容是各元素在原向量從小排到大的排序順位
rev() : 這個函數可將向量物件顛倒排列
order() : 則可以回傳數值在原數據的位置,decreasing=FALSE則回傳從小排到大的相對位置
```R=
x <- c(9, 81, 32, 34, 15, 40, 61, 79, 7, 41)
x
# [1] 9 81 32 34 15 40 61 79 7 41
sort(x) #由小排到大
# [1] 7 9 15 32 34 40 41 61 79 81
sort(x,decreasing = TRUE) #由大排到小
# [1] 81 79 61 41 40 34 32 15 9 7
rank(x) #回傳大小排名
# [1] 2 10 4 5 3 6 8 9 1 7
rev(x) #顛倒順序
# [1] 41 7 79 61 40 15 34 32 81 9
x
#[1] 9 81 32 34 15 40 61 79 7 41
sort(x, decreasing=FALSE)
#[1] 7 9 15 32 34 40 41 61 79 81
order(x, decreasing=FALSE)
#[1] 9 1 5 3 4 6 10 7 8 2
```
:::success
order()輔助說明圖片
![](https://i.imgur.com/HAHLIHv.png)
:::
在排序中也有一類函數可以用資料集中的資料作為排序依據,如同對數據集進行EXCEL的排序功能
```R=
#隨機生成一數據集包含三變數
data<-data.frame(name=LETTERS[1:20],CORP=sample(letters[1:5],20,replace=TRUE),number=sample(100,20))
head(data)
# name CORP number
#1 A b 9
#2 B d 42
#3 C c 65
#4 D b 17
#5 E d 63
#6 F e 96
##依據數據集中number進行排序
head(data[order(data$number),])
# name CORP number
#1 A b 9
#10 J a 15
#4 D b 17
#14 N c 25
#13 M d 32
#8 H a 37
```
或是利用dplyr套件進行排序
```R=
##安裝相關套件
install.packages("dplyr")
library(dplyr)
#利用dplyr中的arrange將data中的CORP進行排序依序在排序number
#可以看到結果與預期的一樣
dplyr::arrange(data,CORP,number)
# name CORP number
#1 J a 15
#2 H a 37
#3 T a 40
#4 S a 72
#5 L a 89
#6 A b 9
#7 D b 17
#8 P b 68
#9 N c 25
#10 C c 65
#11 G c 83
#12 M d 32
#13 B d 42
#14 I d 43
#15 E d 63
#16 Q e 61
#17 K e 70
#18 O e 86
#19 R e 90
#20 F e 96
```
在arrange中可以簡單加上負號使結果變為降序排列
```R=
dplyr::arrange(data,CORP,-number)
# name CORP number
#1 L a 89
#2 S a 72
#3 T a 40
#4 H a 37
#5 J a 15
#6 P b 68
#7 D b 17
#8 A b 9
#9 G c 83
#10 C c 65
#11 N c 25
#12 E d 63
#13 I d 43
#14 B d 42
#15 M d 32
#16 F e 96
#17 R e 90
#18 O e 86
#19 K e 70
#20 Q e 61
```
# 向量物件特徵
向量長度
---
length() : 可計算向量長度, 也就是向量物件元素個數。
```R=
x <- sample(100,10)
length(x)
# [1] 10
```
基本統計函數
---
sd(x, na.rm = FALSE) :樣本標準差(Standard Deviation)
此函數計算x中值的標準偏差。如果na.rm為TRUE,則在計算進行之前刪除缺失值。
var(x, y = NULL, na.rm = FALSE, use)
樣本變異數(Variance)