--- 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)