基礎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]) |