Professional Documents
Culture Documents
R講義
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。
變更現行目錄 → 檢視目錄下的檔案,檢視工作環境下的物件
CH2 變數的概念
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
attach(mlb)
看到 mlb 被放在第 ? 項
search()
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 算術與邏輯運算
CH1 物件的基本模式
CH2 物件的種類
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. 建造一長度為三的向量,其每個元素皆為一種冰淇淋口味。
4. 建造一向量為一到一百間的奇數。
5. 測試是否可建構一向量由混合模式的元素組成:向量中的三
B. Matrix
建構 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))
CH2C 隨堂練習:
個位置放入一個長度為 5, 全為 1 的向量。將第一個位
名為 m1c。
使用 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)]
m1=lm(R~H, data=mlb)
attributes(m1)
summary(m1)
CH3 算術與邏輯運算
也可用 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)
n=10000
x=seq(0, 2, length=n)
sum((x^2)*(2/n))
CH3A 隨堂練習:
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 隨堂練習:
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. 將資料分割為國家聯盟以及美國聯盟兩筆資料,並只選取
以及 SB 的聯盟當季平均。
HR 以及 SB 這幾個項目中,各是哪些隊伍墊底。
HR 以及 SB 這幾個項目中,各是哪些隊伍表現最好。
5. 建立一個長度為三的 list,每個位置分別儲存 2, 3, 以及 4.
的結果。
R 介紹 第三課 自建函數
在撰寫程式的過程中,有時我們會將部分的步驟寫為函數,如此可增加我
們在撰寫程式中的方便性,並使得程式整體的邏輯性更明確清楚。例如,
R 內建的 mean() 函數,讓我們在寫程式時若需要計算平均數時,可直接
使用,並不需要寫另外一行程式來計算平均數。
在 R 中,建立函數的語法如下:
範例一:建立計算兩個數字和的函數
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'
範例三:建立一函數找向量最小值的位置
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)]
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:
e3 x 4 ln( x )( x 2 3)
f ( x)
x 3 2x 2 3
隨堂練習 B:
1. MLB 的資料測試以下你所寫的函數。
及 interquartile range,取至小數後第三位。將結果輸出
為一向量,並標示各元素的名稱。
(需要能計算有缺失值的情況,取小數點後三位),並畫出
每一個變數的 boxplot。
2. 判斷以下函數的用途。其中 x 與 y 為長度相同的向量,可
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,就是有
著迴圈函數的功能,幫助我們重覆的對矩陣的列或是行做同樣的事情。
在 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)
然後在每個位置放進你所規劃的統計量:
第一行都放 sample mean,第二行都放 sample 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")
b b
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
}
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
CH1B 隨堂練習:
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)
}