基礎R語言教學
前言
- 本講義為本人曾在國立中山大學財務管理系開設 3 小時之程式語言課程,若有錯誤請不吝嗇予以指正!
- 本講義可免費使用,若要使用於其他公開用途,請寄信告知,感謝!
- 教材下載:https://goo.gl/atztW1
基礎操作
Assignment
<-(快捷鍵:Alt + -)(Alt + 注音符號ㄦ)=
1 | x <- 1 |
註解
- 加上
#字號,輔助說明程式碼,在程式執行過程中不會被執行
基礎運算
- 加
+減-乘*除/ - 整除
%/%,餘數計算%% - 平方
**``^,平方根sqrt(x) - 指數
exp(x),對數log(x) NA: 缺失值NaN: Not a Number(無意義的數)Inf: 正無窮大
1 | (100+200)/(10+5) |
邏輯運算
&與&&(AND)|與||(OR)!(NOT)==(等於)!=(不等於)- 大於(
>),小於(<) - 大於等於(
>=),小於等於(<=) %in%(包含於)
文字字串
- 字串可由單引號(
'')或雙引號("")構成 paste():將字串與數字做黏合,字與字之間有間隔paste0():將字串與數字做黏合,字與字之間沒有間隔print():顯示變數結果cat():將字串與數字做黏合,並且顯示出來,可作為進度條使用- 更多內容請詳閱:https://www.ptt.cc/bbs/Statistics/M.1277714037.A.2CC.html
1 | paste('Allen', "Mark", "Peggy") # with blanks |
資料類型
| 資料類型 | 辨別函數 | 轉換函數 |
|---|---|---|
| character | is.character() | as.character() |
| complex | is.complex() | as.complex() |
| double | is.double() | as.double() |
| integer | is.integer() | as.integer() |
| logical | is.logical() | as.logical() |
| NA | is.na() | as.na() |
| numeric | is.numeric() | as.numeric() |
資料結構
| 變數種類 | 說明 | 使用頻率 |
|---|---|---|
| vector | 儲存單一變數的觀察值 | 經常使用 |
| matrix | 用於矩陣運算,矩陣內僅能放入數值 | 經常使用 |
| data-frame | 儲存整個資料檔,內容可包含數值與字串等,像 Excel 那樣的表格 | 經常使用 |
| list | 可儲存多種物件(objects),向量、矩陣、data-frame、function 等等 | 偶爾 |
| factor | 儲存分類變數(性別、等第…) | 偶爾 |
| array | 多維矩陣 | 很少 |
| ts | 儲存時間序列資料,通常會使用其他更好的套件 | 很少 |
向量與向量運算
- 經常使用 c( )結合各種小元素,形成一個較大的物件
seq:seq(起始值, 結束值, by = 遞增值)rep: rep(x, times = 重複次數, each = x 內的元素重複幾次)length:計算向量中的元素個數sum:將向量中的所有元素加總prod:將向量中的所有元素相乘cumsum:累積相加cumprod:累積相乘
1 | aa=c(1,2,3,4,5);aa=c(1:5);aa=seq(from = 1, to = 5, by = 1) |
排序函數
sort:數字由小到大排序(也可以由大到小排序)rank:顯示每個元素在排序之後的「排序順位」order:先將向量的元素由小到大排序,再將排好之後的元素在原來向量的數字指標回傳
1 | c=c(1,10,5,22,6,19,20) |
向量指標用法 & which 篩選條件
1 | x <- c(11, 12, 13) |
統計運算
1 | y <- c(1, 12, 100) |
客製化函式
- 以標準化為例
1 | standard <- function(x){ |
矩陣
matrix(data = NA, nrow = 列數, ncol = 欄數, dimnames = 給定列和欄名稱, byrow = 排列元素是否按列排序,預設為FALSE)t(A):轉置矩陣solve(A):反矩陣%*%:矩陣相乘diag(A):回傳矩陣 A 的對角元素diag(diag(A)):生成僅有對角元素的對角矩陣diag(3):生成單位矩陣
1 | A=matrix(1:20,nrow=5,ncol=4) |
rbind.cbind & 矩陣排序
- matrix 與 data.frame 同樣適用
rbind
cbind
重要:合併時請注意資料長度是否相同
矩陣排序
1 | xx<-c(1, 1, 3:1, 1:4, 3) |
Data.Frame
基本應用
1 | d=c("Amy","Betty","Cindy","Dora","Emily","Frank","Grace","Hank","Ivy","John") #文字要加引號 |
指標用法 & which 篩選資料
- 以鳶尾花資料集(iris dataset)為例
_ Sepal.length(花萼長度)
_ Sepal.width(花萼寬度)
_ Petal.length(花瓣長度)
_ Petal.width(花瓣寬度) * Species(物種):山鳶尾(setosa)、變色鳶尾(versicolor)、維吉尼亞鳶尾(virginica)、
1 | data("iris") |
List
1 | rec <- list(name="Mark", age=28, scores=c(81, 79, 96)) |
分配抽樣

- d:機率密度函數
- p:累積機率密度函數
- q:分位數
- r:隨機抽樣
1 | #從標準常態分配中隨機抽出25個數字 |
if else 條件判斷式
else與else if可視為一種可拆式配件,有需要再用即可else if的寫法必須在 else 之前
1 | A=-4 |
迴圈
for-loop
1 | # 計算 1+2+3+4...+100 的值是多少? |
while-loop
1 | # 計算 1+2+3+4...+100 的值是多少? |
repeat-loop
1 | # 計算 1+2+3+4...+100 的值是多少? |
常見操作
套件安裝&讀取
install.packages:安裝套件library:讀取套件require:安裝+讀取套件
1 | install.packages("openxlsx") |
讀取資料
csv 檔
1 | data <- read.csv("E:/R程式教學/10檔股票日頻報酬率.csv") |
Excel 檔
1 | close1 <- read.xlsx("E:\\R程式教學\\10檔股票日頻收盤價.xlsx",sheet=1) |
txt 文字檔
1 | close2 <- read.table(file = "10檔股票日頻收盤價.txt", sep = "\t", head = T, stringsAsFactor = F) |
迴歸
lm:lm(formula = y~x, data=資料集)
1 | #簡單迴歸 |
綜合練習
- 對大盤指數報酬率與每一檔股票做迴歸分析,並將迴歸係數儲存成一張表格
- 提示:for-loop、if else、lm、cbind 或 rbind
$$
Ret_m=a_i+b_{i,m}Ret_i \ , \ i=1,2, …, 10
$$
解答
1 | for(i in 1:10){ |
補充
共變異數 covariance
1 | cov.data <- cov(data[, 2:12]) |
相關係數 correlation
1 | corr.data <- cor(data[, 2:12]) |
