Download as pdf or txt
Download as pdf or txt
You are on page 1of 27

R 介紹 第一課

CH1 工作環境介紹
CH2 變數的概念
CH3 使用敘述統計描述資料

CH1 工作環境介紹

A. 三個視窗
R Console,R 編輯器,R Graphics

B. 檢視目錄下的檔案
dir()

檔案 → 變更現行目錄:H:/計統/RWork/
dir()
getwd()

C. 檢視工作環境下的物件
ls()

D. 編輯程式碼
輸入 R 程式碼:H:/計統/Slides/R 講義 1_Ex1.R 從 ls() 中可看到
開啟命令稿:H:/計統/Slides/R 講義 1_Ex1.R 新的物件已產生
建立新的命令稿

E. 儲存 從 dir()
(打入 a=3,用 ls() 檢視) 中可看到
儲存工作空間:20190222.RData 新的檔案
儲存命令歷程:20190222.R 已產生
CH1 隨堂練習:

關掉再重新開啟 R。

變更現行目錄 → 檢視目錄下的檔案,檢視工作環境下的物件

載入工作空間 20190222.RData → 檢視工作環境下的物件

CH2 變數的概念

A. 使用 ls() 觀察 2+3 與 x=2+3 的不同之處。

B. 算術
四則運算:+, -, *, /
次方:2^3
開根號:sqrt(4), 8^(1/3)
指數與對數:log(3), exp(3)
絕對值:abs(-3)

CH2 隨堂練習:

計算

1
exp[( 3  0) 2 ]
2

的值,並將此值存在 f3 這個變數之中。
CH3 使用敘述統計描述資料

A. 使用 read.table() 讀入資料
mlb=read.table(“H:/計統/Slides/DATA_MLB2016.txt”,
sep=”\t”, header=T, na.strings=”.”)
或可使用相對路徑
mlb=read.table(“../Slides/DATA_MLB2016.txt”, sep=”\t”, header=T,
na.strings=”.”)
或將檔案直接儲存於工作目錄中
mlb=read.table(“DATA_MLB2016.txt”, sep=”\t”, header=T, na.strings=”.”)

B. 使用 names() 得知變數名稱
names(mlb),
利用錢符號擷取變數:mlb$R

C. 使用 attach() 將資料內部變數加入 R 的搜尋記憶


search()

attach(mlb)
看到 mlb 被放在第 ? 項
search()

比較 ls() 與 ls(pos=2) 的不同處


使用 detach(2) 卸除對於 mlb 變數的記憶

D. 擷取部分資料
1. 擷取單變數: R, mlab[,1], mlb$R, mlb[,”R”]
2. 擷取多個變數: mlb[, c(“R”, “H”, “League”)], mlb[, c(4,5,1)]
3. 擷取單列: mlb[1,]
4. 擷取多列: mlb[c(1,3,5),]
5. 同時擷取變數與列: mlb[c(1,3,5), c(“R”, “H”)]
6. 條件式擷取多列(單行):
Tm[League==”A”], R[League==”A” & Region==”E”]
7. 條件式擷取多列(多行):
mlb[mlb$League==”A”, c(“R”,”H”)], mlb[mlb$R>=800,
mlbAE=mlb[mlb$League==”A” & mlb$Region=”E”,]
E. 使用敘述統計的函數
1. 樣本平均數 mean(): 比較 mean(SO) 與 mean(SO, na.rm=TRUE)
2. 樣本變異,樣本標準差 var(), sd()
3. 關係係數 cor(,): cor(R, H)
4. 次數表,列聯表 table(): table(League), table(League, Regions)
5. 其他: min(), max(), summary()

F. 繪圖
1. 長條圖 barplot():
aa=table(League) ; barplot(aa)
2. 箱型圖 boxplot():
boxplot(R) → title(“名字”)
boxplot(R~League, names=c(”American”, “National”)
3. 直方圖 histogram():
hist(R, main=”Histogram of the Number of Runs”)
4. 散佈圖 plot():
plot(H, R, xlab=”The Number of Hits”, ylab=”The Number of Runs”)
5. 兩兩散佈圖 pairs():
pairs(mlb)
pairs(mlb[,4:11])
6. 分割視窗:
par(mfrow=c(2,3))
par(mfcol=c(2,3))
CH3 隨堂練習:

1. 計算美國聯盟的隊伍的平均三振數。

2. 在國家聯盟的隊伍中,三振數最多的隊伍投出多少個三振?

3. 在國家聯盟中,有多少隊伍位在西區?

4. 以 boxplot 呈現美國聯盟與國家聯盟安打數的比較。

5. 以 barplot 呈現在這個資料中,東,西與中三區的隊伍數目。。

6. 以 1x2 的版面配置呈現

(a) 美國聯盟西區隊伍

(b) 國家聯盟西區隊伍,

其全壘打數與安打數間的散佈圖,並計算兩個變數的相關係數。
R 介紹 第二課
CH1 物件的基本模式
CH2 物件的種類
CH3 算術與邏輯運算

在撰寫 R 程式中,物件的概念非常重要。在 R 環境中每一樣儲存下來「東


西」,小到一個數,大到一個模型配置後的所有結果(包括參數的估計值,參數
的標準物,模型配適度,等等),都可看作是一個物件。

CH1 物件的基本模式

常見的物件基本模式 (mode) 有 numeric, character 與 logical. 一個物件


的基本模式可以用 mode() 來查詢。
1. Numeric: x=2, x=log(8)
2. Character: x=”TRUE”, x=”Apple”
3. Logical: x=TRUE, x=FALSE

可用 as.character 以及 as.numeric 來強制轉換。例如:


x=2.5
y=as.character(x)
z=as.numeric(y)

CH2 物件的種類

以下分別介紹 vector,matrix,dataframe,list 以及 lm 五種物件。其中


vector 與 matrix 必須由相同模式 (mode) 的元素組成,而 dataframe,list
以及 lm 可由混合模式的元素組成。
A. Vector

a b c d e 長度為 5 的向量,將其命名為 v。
第一個位置 v[1] 儲存了 a;
第五個位置 v[5] 儲存了 e。
1. 建造空白的向量:x=vector(“numeric”, 10),
x=vector(“character”, 5),
x=vector(“logical”, 3)
2. c 的使用:x=c(2, 5, 1.25)
3. 冒號的使用:建造間隔為 1 的數列 x=1:10, -3:3, 2.7:9
4. 建造數列:x=seq(from=0, to=1, by=0.1),
x=seq(from=1, to=0, by=-0.3),
x=seq(from=0, to=1, length=3)
5. 重覆元素:x=rep(1:4, 3),
rep(1:4, each=2),
rep(1:4, c(2,1,2,3))
6. 覆蓋部份元素:x[c(1,3)]=c(2,2)
7. 查看一物件是否為向量類型:is.vector(x)
8. 查看一向量的模式:mode(x)
9. 向量的長度(向量中元素的個數):m=length(x)
10. 向量中部份元素的擷取:x[3], x[c(2,5,1)], x[c(-1,-3)]
CH2A 隨堂練習:

1. 建造一向量並儲存為 v:0 2 2 5 0 2 4 6 5 4。

2. 建造一長度為三的向量,其每個元素皆為一種冰淇淋口味。

3. 用 seq 以及 rep 建造一向量為:5 7 7 9 9 9 11 11 11 11

4. 建造一向量為一到一百間的奇數。

5. 測試是否可建構一向量由混合模式的元素組成:向量中的三

個元素分別為 3, “Apple”與 FALSE。

B. Matrix

1. 直接建構矩陣:x=matrix(0, nrow=3, ncol=3),


matrix(NA, nrow=4, ncol=2),
x=matrix(1:16, nrow=4, ncol=4)
2. 使用 rbind 或 cbind 建構矩陣:cbind(v1=c(2,3,4),v2=c(5,6,7)),
x=rbind(1:4, 5:8, 9:12)
3. 查看一物件是否為矩陣類型:is.matrix(x)
4. 查看一矩陣的模式:mode(x)
5. 矩陣的維度:m=dim(x), dim(x)[1], dim(x)[2]
6. 矩陣中部份元素的擷取:x[1,3], x[c(1,3), 1:2], x[2,], x[,3]
C. List

建構 list 的方法:
1. a. 建構 list 空白的 list:x=vector(“list”, 3)
b. 在 list 中可放入完全不同類型的物件:x[[1]]=3, x[[2]]=rep(0,4)
c. 使用 names():names(x)=c(“a”, ”b”, ”c”)

2. 直接建構 list:
x=list(a=3, b=rep(0:4), c= matrix(1:4, nrow=2, ncol=2))

3. 可用 x$a 或是 x[[1]] 代表 list 中的元素

CH2C 隨堂練習:

1. 建造一個長度為三的 list 並命名為 m1,其中第一個位置

放入數字 3,第二個位置放入一個 3x3 的單位矩陣,第三

個位置放入一個長度為 5, 全為 1 的向量。將第一個位

置取名為 m1a,第二個位置取名為 m1b,第三個位置取

名為 m1c。

2. 利用 1. 中的 list,用 sum() 計算 list 中所有數字的和。


D. Dataframe

 使用 Data_MLB2016 的資料:
mlb=read.table(“DATA_MLB2016.txt”, sep=”\t”, header=T, na.strings=”.”)
使用 attributes() 觀看 mlb 的屬性。

 建構 dataframe 的例子:
1. data=matrix(1:9, nrow=3, ncol=3)
2. 檢查 data 的模式:is.matrix(data), is.data.frame(data)
3. 強制其成為 datafrome 物件:
data=as.data.frame(data)
再用 is.data.frame(data) 檢查一次
4. 設定資料行列名稱:
row.names(x)=c(“Apple”, ”Banana”, ”Citrus”)
names(data)=c(“Color”, ”Shape” , ”Taste”)
5. 擷取資料:data[“Apple”, “Taste”]
data$Color
data[2, c(1,3)]

E. lm (線性回歸, linear model)

m1=lm(R~H, data=mlb)
attributes(m1)
summary(m1)
CH3 算術與邏輯運算

A. 算術運算: +, -, *, /, ^, sqrt(), %*%, sum(), prod()


x=cbind(1:5, 6:10)
v1=x[,1]
v2=x[,2]
n

1. 對應元素運算(非矩陣運算): v1*v2 相當於  (v1[i] * v 2[i])


i 1

也可用 x 表示
x[,1]+x[,2], x[1,]*x[2,], x[1,]*x[,2]
x[,1]^2
2. 矩陣運算:x%*%t(x), t(x)%*%x
3. 列或行運算:apply(x, 2, sum), apply(x, 1, prod)

範例:求 f(x)=x2 在 [0,2] 上的積分


n
ba
 f (x )
b
a
f ( x )dx  lim
n 
i 1
i
n

n=10000
x=seq(0, 2, length=n)
sum((x^2)*(2/n))
CH3A 隨堂練習:

使用 MLB2016 這份資料。令 x=R, y=H,也就是 x[1]=752,

x[2]=649, …, y[1]=1479, y[2]=1404, …。計算以下數學算式:

x
2
1. i
i 1

2. (x
i 1
i  x )2

3. xy
i 1
i i

4. (x
i 1
i  x )( yi  y )

n n

5. (x
i 1
i  x)yi (x
i 1
i  x )2

CH3B 隨堂練習:

求 f(x)=x5ex 在 [0,1] 上的積分


B. 邏輯運算: !=, ==, & , |

x=c(1, 1:5)
x>3
x!=2
x[x!=2]
(x>=3) & (x<=3)
(x>=2) | (x>=3)
x[x!=2]

which(x==1)
which.min(x),
which.max(x)
which(x==min(x)),
which(x==max(x))
CH3C 隨堂練習:

使用 MLB2016 這份資料。

1. 將資料分割為國家聯盟以及美國聯盟兩筆資料,並只選取

Tm, R, H, X2B, X3B, HR 這幾個變數。

2. 對每一筆資料,以 apply 同時計算 R, H, X2B, X3B, HR,

以及 SB 的聯盟當季平均。

3. 對國家聯盟的資料,以 apply 同時找出在 R, H, X2B, X3B,

HR 以及 SB 這幾個項目中,各是哪些隊伍墊底。

4. 對美國聯盟的資料,以 apply 同時找出在 R, H, X2B, X3B,

HR 以及 SB 這幾個項目中,各是哪些隊伍表現最好。

5. 建立一個長度為三的 list,每個位置分別儲存 2, 3, 以及 4.

的結果。
R 介紹 第三課 自建函數

在撰寫程式的過程中,有時我們會將部分的步驟寫為函數,如此可增加我
們在撰寫程式中的方便性,並使得程式整體的邏輯性更明確清楚。例如,
R 內建的 mean() 函數,讓我們在寫程式時若需要計算平均數時,可直接
使用,並不需要寫另外一行程式來計算平均數。

在 R 中,建立函數的語法如下:

自取函數的名字 = function (參數 1, 參數 2, 參數 3, …) {


你要函數做的事情
return(你需要儲存或輸出的物件)
}

R 將你放在 return 裡的物件,儲存在函數中。以下為幾個範例。

範例一:建立計算兩個數字和的函數

mysum=function(a,b){
print(“I am very smart *^___^*”)
a*b
return(a+b) }
範例二:建立計算兩個數字四則運算的函數

myopt=function(a,b){
v=vector(“numeric”, 4)
v[1]=a+b
v[2]=a-b
v[3]=a*b
v[4]=a/b
names(v)=c(“Sum”, “Subtraction”, “Product”, “Division”)
return(v)
}

當 vector 的元素內的運算不複雜時,可用較簡單的寫法。

myopt=function(a,b){
v=c(a+b, a-b, a*b, a/b)
names(v)=c("Sum", "Sub", "Prod", "Div")
return(v)
}

注意:R 對於 v 是沒有記憶的。因此,若要使用減法的結果,必須以
myopt(3,5)[2] 代表,而不是 v[2]。以下為執行結果:

>myopt(3,5)[2]
Sub
-2
> v[2]
錯誤: 找不到物件 'v'
範例三:建立一函數找向量最小值的位置

R 的內建函數 which.min 只能找到最小值的其中之一。以下函數可以找


出所有的最小值。

mywhich.min=function(x){
minx=min(x)
return(which(x==minx))
}

> x=c(1,5,2,6,3,1,2)
>x
[1] 1 5 2 6 3 1 2
> which.min(x)
[1] 1
> mywhich.min(x)
[1] 1 6

範例四:建立一函數可計算有缺失資料的平均數,並將此平均數四捨五
入至小數第三位。

mymean=function(x){
m=mean(x, na.rm=T)
return(round(m, 3))
}

使用 MLB 的資料。僅擷取連續性變數。

> mlb1=mlb[,-(1:3)]

比較 apply(mlb1, 2, mean) 與 apply(mlb1, 2, mymean) 的區別。


範例五:建立一函數,並建立其微分函數。

f=function(x){
return(x^2)
}

微分的定義:

d f ( x  x)  f ( x)
f ( x)  lim
dx x  0 x

fd1=function(x){
dx=0.00001
a=(f(x+dx)-f(x-dx))/(2*dx)
return(a)
}

隨堂練習 A:

計算以下函數的在 x=3.3 的微分值。

e3 x  4 ln( x )( x 2  3)
f ( x) 
x 3  2x 2  3
隨堂練習 B:

1. MLB 的資料測試以下你所寫的函數。

(a) 建構一函數,計算一變數的 mean, median, variance, 以

及 interquartile range,取至小數後第三位。將結果輸出

為一向量,並標示各元素的名稱。

(b) 建構一函數,計算資料中各變數的 mean 與 variance

(需要能計算有缺失值的情況,取小數點後三位),並畫出

每一個變數的 boxplot。

2. 判斷以下函數的用途。其中 x 與 y 為長度相同的向量,可

將 (x[i] , y[i] ) 看作二維空間平面中的一點。

myfun=function(x,y){
v1=(x>y)
v2=which(v1==TRUE)
a=vector(“list”, 2)
a[[1]]=v2
a[[2]]=cbind(x[v2], y[v2])
plot(x, y, col=1)
points(x[v2], y[v2], col=2)
lines(c(-10,10), c(-10,10))
return(a)
}
使用 “Ex3B2Data.txt” 呈現此函數的用途。

3. 模仿 2. 的方法,寫一函數判斷“Ex3B3Data.txt” 中的哪些

點不在「以圓點為中心半徑為 5」 的圓上。在二維平面上畫

出所有的點,並將不在圓上的點以紅色表示。
R 介紹 第四課 迴圈
CH1 For Loop
CH2 While Loop

有的時候,我們需要重覆做一件相同的事情,但是我們不想不斷複製程式碼,
因為這樣太累贅了。因此,許多程式語言,像是知名的 C 語言,也包括統計人
常使用的 R 與 matlab,都內建了一個可以幫助我們重覆做同樣事情的函數。
這種函數,我們稱為迴圈函數。例如,我們在前幾課中學到的 apply,就是有
著迴圈函數的功能,幫助我們重覆的對矩陣的列或是行做同樣的事情。

在一般的程式語言中,最常用的迴圈是 for 與 while。兩者有異曲同工之妙,但


各有各較為適合使用的情況。

CH1 For Loop

在 R 中,for 的語法如下:

for ( i in 範圍 ) {
你想重覆做的事情。
}
A. 單迴圈

範例一:重覆列印五次

for (i in 1:5){
print("Mishka, Mushka, Mickey Mouse!")
print(i)
}

範例二:計算 1 加到 100 的和

sum=0
for (k in 1:100){
sum=sum+k
print(sum)
}
範例三:如同 apply 的作用

讀進 MLB 的資料。
mlbs=mlb[, 4:ncol(mlb)]
nc=ncol(mlbs)

讓 R 空出一個放 2X8 的矩陣的位置:

out=matrix(NA, nrow=2, ncol=nc)

然後在每個位置放進你所規劃的統計量:
第一行都放 sample mean,第二行都放 sample variance。

(1,1) (1,2) (1,3)


R 的 mean H 的 mean X2B 的 mean ……
(2,1) (2,2) (2,3)
R 的 variance H 的 variance X2B 的 variance ……

for (j in 1:nc){
out[1,j]=mean(mlb[,j], na.rm=TRUE)
out[2,j]=var(mlb[,j], na.rm=TRUE)
}

最後加入名字:
colnames(out)=names(mlb)[4:11]
rownames(out)=c("Mean", "Variance")

Remark: 若改設定一個大小為 3x10 的矩陣,並將以上的 16 個統計量從


第二列及第三行的格子,依序放入。該如何調整語法?
範例四:求 f(x)=x2 在 [0,2] 上的積分

b b

∫ f(x)dx ≈ lim ∑ f(x)∆x


a ∆x→0
x=a

f=function(x){
return(x^2)
}

求在 [0,2] 上的積分

dx=10^(-5)
x=seq(from=0, to=2, by=dx)
sum=0
for (i in x[-1]){
sum=sum+f(i)*dx
}

Remark: 也可使用第二課 CH3A 範例中的寫法。


CH1A 隨堂練習:

1. 將九九乘法表儲存至一個 9x9 的矩陣中。

2. 令 X~Gamma(2, 5),求 Pr(X>10)。

1
f (x)  
x 1e  x / 
( )

B. 雙迴圈

範例五:畫星星 *

for (i in 1:5){
for (j in 1:i){
cat("*")
}
cat("\n")
}

範例六:求以原點為中心,半徑為一的圓的面積:x 2 + y 2 = 1 。

1 1 x 2

1  1 x 2
dydx

重積分的 Riemann Sum:


b d(x)
b d(x)
∫ ∫ f(x)dydx ≈ lim ∑ ∑ f(x)∆A
a c(x) ∆A→0
x=a y=c(x)
sum=0
d=10^(-2)
x=seq(-1,1, by=d)
for (i in x){
y=seq(-sqrt(1-i^2), sqrt(1-i^2), by=d)
for (j in y){
sum=sum+1*d*d
}
}

CH1B 隨堂練習:

3. 利用雙迴圈將九九乘法表儲存至一個 9x9 的矩陣中。

4. 利用雙迴圈畫一棵沒有樹幹的聖誕樹。

3 2y
5. 計算 ∫0 ∫y √x 2 + y 2 dx dy
CH2 While Loop

在 R 中,while 的語法如下:

while ( 條件 ) {
你想重覆做的事情。
}

範例一:重覆列印五次

k=0
while (k<6){
print("Mishka, Mushka, Mickey Mouse!")
k=k+1
print(k)
}

範例二:計算 1 加到 100 的和

sum=0
k=1
while (k<=100){
sum=sum+k
k=k+1
print(sum)
}
以下的範例顯現出 while 與 for 的主要差異:在使用 for 時,我們需要明
確的知道迴圈要重覆幾次,但有時我們其實是不知道的。此時,使用 while
則較為方便。

範例三:重覆列印數次(次數未知)直到條件滿足

k=20
while (k>0){
print("Mishka, Mushka, Mickey Mouse!")
k=k-3
print(k)
}

You might also like