1、條件與迴圈等程式技巧條件與迴圈等程式技巧Data FramesData frames:it is a rectangular table with rows and columns;data within each column has the same type(e.g.number,text,logical),but different columns may have different types.資料篩選資料轉換(變更coding)將資料按照性別分成兩群,令新變數為sex_c男生(原始資料記為1):sex_c=“male”女生(原始資料記為0):sex_c=“female”將資料按照
2、年紀分成四群,另外令一個變數為agegroup第一群:40歲以下,則agegroup=1第二群:4049歲,則agegroup=2第三群:5059歲,則agegroup=3第四群:60歲以上,則agegroup=4條件執行指令條件控制:ifelse函數;if,else if 與 else指令1:ifelse(condition,yes,no)用於最簡單的二分類判斷狀況通常用於簡單的變數計算。指令2:if(condition_1)expression_1 else if(condition_2)expression_2 else if(condition_3)expression_3 else
3、expression_4判斷式中的運算子指令說明例子,=,相當於判斷x=3判斷式中的運算子if()或 while()括弧內當使用&與與|跟與與|是有差別的。&與|代表and 與or:適用於單一單一真假值的判斷。與|也代表and 與or:適用於向量式向量式的真假值運算。如果運算對象為數字或是數字變數,則兩種運算子沒有差異;但若運算對象是向量或多維度的陣列、data frame,就有明顯的區別判斷式中的運算子ifelse 用法指令1:ifelse(condition,yes,no)若x10 則 y=1,若x=10 則 y=2x=c(1,2,3,4,5),若x中的元素小於3,則z=x*y,否則 z=
4、x*log(y)if 用法只有if:if(condition)expression 如果判斷條件為真,則執行括弧後面的運算式 多於一個執行狀況時,使用:if else 用法指令2:if(condition_1)expression_1 else if(condition_2)expression_2 else if(condition_3)expression_3 else expression_4Note:if()小括弧內的邏輯判斷式為一個 TRUE/FALSE的值,雖然也可以是一個由TRUE/FALSE組合而成的邏輯向量。但只要這個邏輯向量的第一個元素值為TRUE,則邏輯判斷式就算為真如:
5、if else 容易產生的錯誤不會產生錯誤的寫法:if else寫在同一列if else 容易產生的錯誤會產生誤判的寫法:(1)R誤認為第一列已經是一個完整且結束的單獨if運算式,所以 第二列的else會被認為缺乏if,故產生錯誤。(2)R認為第二列已結束完整的if 運算式,所以第三列錯誤。if else 容易產生的錯誤建議寫法:在if,else if,以及else之後都加上,並依照下列 格式撰寫正確寫法:if(condition_1)expression_1 else if(condition_2)expression_2else if(condition_3)expression_3 el
6、se expression_4如:迴圈(Loop)迴圈:主要由 for、while 與 repeat 所構成迴圈範圍中可以使用break跳出迴圈,或是使用next跳過剩下的敘述句,直接進入下一個迴圈。R裡面可用向量或是矩陣運算函數取代迴圈的運算,執行速度會更快。for 迴圈指令1:for(迴圈變數in 範圍)單一完整運算式指令2:for(迴圈變數in 範圍)一個或多個運算式迴圈變數:通常使用i,j,k,l,m等英文字母範圍:通常是一個數值向量,如:for(i in 1:10)利用for 迴圈計算1+2+9+10while 迴圈指令:while(可繼續留在迴圈內的邏輯判斷式)一個或多個運算式 利
7、用while迴圈計算1+2+3+100repeat 迴圈指令:repeat 一個或多個運算式 if(離開迴圈的條件)break 其他可能的完整運算式 利用repeat迴圈計算1+2+3+100break 與 next:改變迴圈狀態R迴圈內無論是使用for,while或是repeat,都可以藉由break與next來改變迴圈的狀態。break:終止並跳離迴圈,通常是接在某個條件執行式之後。範例:列印member.names內的會員姓名,但若遇到姓名為John的人跳離迴圈break 與 next:改變迴圈狀態next:不終止整個迴圈結構的執行,但是next會忽略跳過目前這一次迴圈,剩下的其他運算式
8、,直接跳到下一次迴圈。範例:只加總1100中的單數資料轉換(變更coding)將資料按照性別分成兩群,令新變數為sex_c男生(原始資料記為1):sex_c=“male”女生(原始資料記為0):sex_c=“female”將資料按照年紀分成四群,另外令一個變數為agegroup第一群:40歲以下,則agegroup=1第二群:4049歲,則agegroup=2第三群:5059歲,則agegroup=3第四群:60歲以上,則agegroup=4迴圈與控制指令agegroup=rep(0,15)for(i in 1:15)if(agei=40)&(agei=50)&(agei60)agegroup
9、i=3 else agegroupi=4datanew=cbind(data,agegroup)#將新變項agegroup與data結合datanew練習計算BMI值:BMI體重(公斤)身高2(公尺2)最健康的BMI值為22,若身體質量指數超過23為過重,超過27為肥胖,若超過35則為極度肥胖。加一欄身高資料,將資料做combine,資料為:(170,176,154,144,160,140,150,161,166,155,141,143,150,172,150)cm令一新的變數為BMI,計算每個人的BMI值。若BMI=22,令BMIindex=1若22BMI=27,令BMIindex=2若27
10、BMI35,令BMIindex=4練習利用while迴圈做1/x在x=1的泰勒展式:若x=0.3,試求泰勒展式要加總到第幾項,才會跟實際值1/0.33.3333 差距在0.00001以內。使用(-1)(i%2)來控制每一項的正負交錯;%是在求餘數。2311(1)(1)(1).xxxx 練習利用repeat迴圈做1/(1-x)的泰勒展式:若x=0.3,試求泰勒展式要加總到第幾項,才會跟實際值1/(1-0.3)1.428571 差距在0.00001以內。2311.1xxxx 自訂函數語法自訂函數名稱function(變數1,變數2,變數3,)expressionR軟體預設將函數內最後一個運算式當作
11、回傳值。若要更改預設,可使用return()將計算值回傳。return()函數傳回的值可包含R軟體的各種變數種類,如:向量、矩陣、但大多都採用list變數當作回傳值。因為list變數可包含不同長度、不同變數種類的元素,可回傳多個不同屬性的函數計算結果。自訂函數自訂函數Ex1:自訂函數Ex2:Ex3:自訂函數眾數自訂函數-練習利用迴圈,寫出將任一向量加總的函數特殊的函數用法參數:將自訂函數裡面用到的其他function需要的參數傳入常用函數統計相關函數sum(x)向量x所有元素的總和prod(x)向量x所有元素相乘max(x)向量x所有元素最大的元素值min(x)向量x所有元素最小的元素值ran
12、ge(x)傳回x的全距length(x)計算向量x的元素個數mean(x)計算x所有元素的平均數median(x)計算x所有元素的中位數var(x),cov(x)計算x所有元素的樣本變異數cor(x)當x為data frame時,傳回x的相關矩陣var(x,y)與 cov(x,y)計算x與y的共變異數(covariance)矩陣cor(x,y)計算x與y的相關係數或相關係數矩陣常用函數統計相關函數rev(x)將x所有元素反向呈現(未排序)sort(x)將x內的元素從小到大排序rev(sort(x)將x內的元素從大到小排序rank(x)傳回x中各元素的排序順序值choose(n,k)計算二項式組
13、合數 n!/(n-k)!k!factorial(x)階乘函數,相當於prod(1:x)常用工具函數處理NA(missing data)的函數na.fail(x):若x包含missing values則傳回錯誤訊息,否則傳回x。na.pass(x):保留x的NA值。na.omit(x)與na.exclude(x):去除NA元素。最大概似估計量(MLE)MLE:利用package(stats4)中的mle函數Usage:mle(minuslogl,start,method)minuslogl:計算-1*log-likelihood 的自訂函數名稱start:儲存參數起始值的list變數method:預設為BFGS或可改為L-BFGS-B,CG,Nelder-Mead,SaNN最大概似估計量(MLE)練習請用迴圈寫出Normal查表值表格之程式(x=0.0,0.01,3.0)練習不用迴圈寫出Normal查表值表格之程式(x=0.0,0.01,3.0)練習列出自由度從120的t分配之查表表格