R教學 單元3 建立新變數及函數的介紹 羅琪老師
利用公式建立新變數 範例問題: 利用身高(height)與體重(weight)來獲得身體質量指數(body mass index, BMI)。BMI代表身體質量指數,公式為 。 使用方法: 產生一新變數命名為BMI,利用公式計算其數值。
軟體操作步驟 利用R中read的方法,將單元2所介紹之資料輸入到R中,並命名為sleepdata。 > sleepdata<-read.csv("c:/RData/sleepdata.csv",header=T) > sleepdata > attach(sleepdata)
sleepdata資料檔 id v_y v_m v_d name sex b_y b_m b_d height weight pressuID pressure sleepHR1 sleepHR0 sleepTR1 sleepTR0 sleepQOL 1 97 25 Java 66 12 161.5 65 8.5 8.7 3 2 Alice 58 5 6 154.5 55 7.3 7.4 4 June 174.6 70 7 7.5 Jack 64 164 42 7.9 Jacoby 49 24 150 50 6.8 6.1 Peter 20 162 63 6.3 48 Kalare 72 176 9.3 Jame 73 9 28 155 45 8.9 Andy 67 10 7.7
利用公式建立新變數 所需使用資料如下: 資料排列 變數名稱 變數說明 變數類型 變數內容 height 身高 連續變數 公分 weight 體重 公斤 id … height weight 1 161.5 65 2 154.5 55 50 176
建立新變數BMI > height1<-height/100 # 將身高單位cm轉換成m > height2<-height1*height1 # 取身高(公尺)的平方 > bmi<-weight/height2 # 代入BMI公式,體重/(身高)2 > a<-cbind(sleepdata,bmi) # 將sleepdata和bmi結合 > a
做BMI的敘述統計 為確認我們的資料無誤,利用R中summary&sd的語法,做連續變項之簡單描述性統計分析,檢查BMI值是否在合理的範圍之內。觀察bmi的最小值、第一四分位數、中位數、第三四分位數、最大值 > summary(bmi) # 5個數字的摘要 Min. 1st Qu. Median Mean 3rd Qu. Max. 16.77 24.73 26.82 27.22 29.79 34.90 > sd(bmi) # 標準差 [1] 4.089639
利用條件式建立新的分組變數 BMI_a代表BMI分組,係按照下列分級標準分組 成人的體重分級與標準 重新編碼 分 級 身體質量指數 分 級 身體質量指數 BMI_a 體重過輕 BMI < 18.5 1 正常範圍 18.5 ≦ BMI <24 2 過 重 24 ≦ BMI < 27 3 輕度肥胖 27 ≦ BMI < 30 4 中度肥胖 30 ≦ BMI < 35 5 重度肥胖 BMI ≧ 35 6 資料來源:衛生署食品資訊網/肥胖及體重控制
根據原有變數代入條件式建立新變數 範例問題: 將身體質量指數分級,並建立分組變數。 使用方法: 產生一新變數命名為bmi_a,並利用條件式將BMI分組。
建立新的分組變數 > bmi_a<-bmi # 建立新變數bmi_a > bmi_a[0<bmi & bmi<18.5]<-1 # 將bmi分組 > bmi_a[18.5<=bmi & bmi<24]<-2 > bmi_a[24<=bmi & bmi<27]<-3 > bmi_a[27<=bmi & bmi<30]<-4 > bmi_a[30<=bmi & bmi<35]<-5 > bmi_a[bmi>=35]<-6 > cbind(sleepdata, bmi_a) # 將sleepdata與bmi_a資料合併
類別變數之描述性統計 > table(bmi_a) # 建立BMI分組的次數分配表 bmi_a 1 2 3 4 5 1 8 17 12 12
類別變數之描述性統計 另外,也可於R中引入套件prettyR,可同時製作百分比。 > library(prettyR) # 引入prettyR套件 > freq(bmi_a) # 建立次數分配表、百分比 Frequencies for bmi_a 3 4 5 2 1 NA 17 12 12 8 1 0 (次數) % 34 24 24 16 2 0 (含NA百分比) %!NA 34 24 24 16 2 (不含NA百分比)
利用條件式建立新的分組變數 BMI_b代表BMI分組,將bmi_a併為3組,即體重過輕、正常範圍及過重或肥胖等三組分組標準如下: 成人的體重分級與標準 重新編碼 併組 註解 分 級 身體質量指數 BMI_a BMI_b 體重過輕 BMI < 18.5 1 過輕 正常範圍 18.5 ≦ BMI <24 2 正常 過 重 24 ≦ BMI < 27 3 過重或肥胖 輕度肥胖 27 ≦ BMI < 30 4 中度肥胖 30 ≦ BMI < 35 5 重度肥胖 BMI ≧ 35 6 資料來源:衛生署食品資訊網/肥胖及體重控制
根據原有變數代入條件式建立新變數 範例問題: 將BMI分級標準併為過輕、正常及過重或肥胖三組。 使用方法: 產生一新變數命名為bmi_b,根據BMI分級標準(bmi_a)將其重新併組為過輕、正常及過重或肥胖三組。
建立新的分組變數 > bmi_b<-bmi_a # 建立新變數bmi_b > bmi_b[bmi_a=1]<-1 # 將bmi_a分組 > bmi_b[bmi_a=2]<-2 > bmi_b[bmi_a>=3]<-3 > cbind(sleepdata,bmi_a,bmi_b) # 將bmi_b、bmi_a與sleepdata資料合併
類別變數之描述性統計 > table(bmi_b) # 建立BMI分組的次數分配表 bmi_b 1 2 3 1 8 41
類別變數之描述性統計 另外,也可於R中引入套件prettyR,可同時製作百分比。 > library(prettyR) # 引入prettyR套件 > freq(bmi_b) # 建立次數分配表、百分比 Frequencies for bmi_b 3 2 1 NA 41 8 1 0 (次數) % 82 16 2 0 (含NA百分比) %!NA 82 16 2 (不含NA百分比)
利用日期函數建立年齡變數 利用日期函數ISOdate(year, month, day) 在資料處理中,我們經常會需要處理日期的計算,例如:從以下的訪視日期與個案的出生年、月、日資料去計算個案的年齡;一般統計軟體會提供日期函數,透過年、月、日的代入(此處年、月、日稱為此函數的3個引數)來處理日期的計算,此外,此處所指的”年”為西元年,故若資料為民國的年,則需加1911將之轉換為西元年。
利用日期函數建立年齡變數 個案代號 訪視日期 出生日期 Id v_y (年) v_m (月) v_d (日) b_y (年) b_m (月) b_d (日) 1 97 25 66 12 2 58 5 6 3 65 … 49 73 9 28 50 67 10
利用日期函數建立年齡變數 範例問題: 利用訪視日期及出生日期來計算個案的年齡。 使用方法: 產生一新變數命名為age,並利用日期函數計算訪視日期及出生日期的差異天數,再轉換為年齡。
利用日期函數建立年齡變數 # 計算b=填表日期-出生日期的天數 > age<-b/365.25 # 計算年齡 > age > b<-ISOdate(v_y+1911,v_m,v_d)-ISOdate(b_y+1911,b_m,b_d) # 計算b=填表日期-出生日期的天數 > age<-b/365.25 # 計算年齡 > age Time differences in days [1] 30.11910 38.72142 32.06023 32.15058 47.83847 30.09719 35.52635 36.49555 35.15674 24.71732 30.24230 44.33949 [13] 21.47023 40.36140 25.57153 40.02190 24.91718 27.79740 43.11020 24.45722 29.79877 27.45517 38.54620 47.26078 [25] 28.98563 35.44695 34.96509 44.99658 31.19781 23.71253 39.89596 25.50308 47.53183 20.47639 21.73854 45.32238 [37] 30.52704 20.25462 20.57495 37.41547 29.84531 33.36071 22.97604 20.36413 40.27379 37.33881 21.92471 24.72005 [49] 23.32375 29.25120
定量變數之描述性統計 > age1<-as.numeric(age) # 將年齡轉換成數字類型 > summary(age1) # 計算年齡的5個數字摘要 Min. 1st Qu. Median Mean 3rd Qu. Max. 20.25 24.77 30.38 32.00 38.26 47.84 > sd(age1) # 計算年齡的標準差 [1] 8.177942 此50個病人的平均年齡為32歲, 標準差為8.17歲
其他常見的函數 常見的統計函數應用: 新變數=統計函數(參數1,參數2,參數3,…) 範例問題: 利用函數來計算數個指定變數(例如:x1,x2,x3分別代表三次考試的成績)的有效樣本個數、遺漏值個數、平均值、變異數、標準差、中位數、變異係數、最大值、最小值等統計值。 使用方法: 產生新變數,並利用統計函數來計算所需要的統計值。
無遺漏值 > x1<-c(92,80,70) # 建立變數 > n1<-sum(!is.na(x1)) # 計算無遺漏值的個數 > n1_m<-sum(is.na(x1)) # 計算遺漏值的個數 > sum1<-sum(x1) # 計算總合 > mean1<-mean(x1) # 平均值 > var1<-var(x1) # 變異數 > sd1<-sd(x1) # 標準差 > cbind(n1,n1_miss,sum1,mean1,var1,sd1) n1 n1_miss sum1 mean1 var1 sd1 [1,] 3 0 242 80.66667 121.3333 11.01514
無遺漏值 > median1<-median(x1) # 中位數 > cv1<-(x7/x5)*100 # 變異係數CV > max1<-max(x1) # 最大值 > min1<-min(x1) # 最小值 > mean_a<-(92+80+70)/3 # 以數學式算平均值 > cbind(median1,cv1,max1,min1,mean_a) median1 cv1 max1 min1 mean_a [1,] 80 13.65513 92 70 80.66667
有遺漏值 # 在有遺漏值的情況下,函數後面需加上 ‘’na.rm=T’’ ,其會去除遺漏值進行計算 > x2<-c(93,NA,98) # 建立變數 > n2<-sum(!is.na(x2)) # 計算無遺漏值的個數 > n2_m<-sum(is.na(x2)) # 計算有遺漏值的個數 > sum2<-sum(x2,na.rm=T) # 計算總合 > mean2<-mean(x2,na.rm=T) # 平均值 > var2<-var(x2,na.rm=T) # 變異數 > sd2<-sd(x2,na.rm=T) # 標準差 > cbind(n2,n2_m,sum2,mean2,var2,sd2) n2 n2_m sum2 mean2 var2 sd2 [1,] 2 1 191 95.5 12.5 3.535534
有遺漏值 # 在有遺漏值的情況下,函數後面需加上 ‘’na.rm=T’’ ,其會去除遺漏值進行計算 > median2<-median(x2,na.rm=T) # 中位數 > cv2<-(sd2/mean2)*100 # 變異係數CV > max2<-max(x2,na.rm=T) # 最大值 > min2<-min(x2,na.rm=T) # 最小值 > mean_b<-(93+NA+98)/3 # 以數學式算平均值 > cbind(median2,cv2,max2,min2,mean_b) median2 cv2 max2 min2 mean_b [1,] 95.5 3.70213 98 93 NA
其他常見的函數 常見的數學函數應用: 新變數=數學函數(參數) 範例問題: 從數學運算函數計算所需的數值。 使用方法: 利用常用的數學函數計算所需的值。
數學函數 > x3<-c(80.6667,95.5000) # 建立變數x1 > log_x3<-log(x3) # 針對x3取log以e為底 > log10_x3<-log(x3,10) # 針對x3取log以10為底 > exp_x3<-exp(log10_x3) # 針對log10_x3取指數 > cbind(x3,log_x3,log10_x3,exp_x3) x3 log_x3 log10_x3 exp_x3 [1,] 80.6667 4.390326 1.906694 6.730802 [2,] 95.5000 4.559126 1.980003 7.242767
數學函數 > x3<-c(80.6667,95.5000) > f_x3<-floor(x3) # 針對x3取整數 > r_x3<-round(x3,0) # 針對x3四捨五入到整數位 > r1_x3<-round(x3,1) # 針對x3四捨五入到小數第一位 > sqrt_x3<-sqrt(x3) # 針對x3開根號 > cbind(x3, f_x3,r_x3,r1_x3,sqrt_x3) x3 f_x3 r_x3 r1_x3 sqrt_x3 [1,] 80.6667 80 81 80.7 8.981464 [2,] 95.5000 95 96 95.5 9.772410
其他常見的函數 日期函數的應用: 範例問題: 從文字格式的日期資料中,計算年齡。 使用方法: 利用利用文字萃取函數的日期,獲得部分字串,將其轉換為數值後,再以日期函數計算年齡。
日期函數 > b_day<-“061087” # 建立一串文字型的數列 > dt_char<-substr(b_day,1,2) > dt_char [1] "06" > mn_char<-substr(b_day,3,4) > mn_char [1] "10" > yr_char<-substr(b_day,5,6) > yr_char [1] "87" # 以substr函數選取需要的文字,substr(資料,開始選取的位置,選取結束的位置)
日期函數 # 將以上的文字以as.numeric函數變成數字 # 將所有選取好的數字轉變成日期型式,函數為ISOdate(年,月,日) > dt_num<-as.numeric(dt_char) > dt_num [1] 6 > mn_num<-as.numeric(mn_char) > mn_num [1] 10 > yr_num<-as.numeric(yr_char) > yr_num [1] 87 > b<-ISOdate(yr_num+1911,mn_num,dt_num) > b [1] "1998-10-06 12:00:00 GMT" > age<-(Sys.time()-b)/365.25 > age Time difference of 17.46348 days # 將所有選取好的數字轉變成日期型式,函數為ISOdate(年,月,日) # Sys.time()函數可以顯是當下的日期,令資料為age將選取好的日期與當下的日期相減得到年齡
付出最多的人,也是收穫最多的人 ~共勉之~