Presentation is loading. Please wait.

Presentation is loading. Please wait.

R教學 單元3 建立新變數及函數的介紹 羅琪老師.

Similar presentations


Presentation on theme: "R教學 單元3 建立新變數及函數的介紹 羅琪老師."— Presentation transcript:

1 R教學 單元3 建立新變數及函數的介紹 羅琪老師

2 利用公式建立新變數 範例問題: 利用身高(height)與體重(weight)來獲得身體質量指數(body mass index, BMI)。BMI代表身體質量指數,公式為 。 使用方法: 產生一新變數命名為BMI,利用公式計算其數值。

3 軟體操作步驟 利用R中read的方法,將單元2所介紹之資料輸入到R中,並命名為sleepdata。
> sleepdata<-read.csv("c:/RData/sleepdata.csv",header=T) > sleepdata > attach(sleepdata)

4 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

5 利用公式建立新變數 所需使用資料如下: 資料排列 變數名稱 變數說明 變數類型 變數內容 height 身高 連續變數 公分 weight
體重 公斤 id height weight 1 161.5 65 2 154.5 55 50 176

6 建立新變數BMI > height1<-height/100 # 將身高單位cm轉換成m > height2<-height1*height1 # 取身高(公尺)的平方 > bmi<-weight/height2 # 代入BMI公式,體重/(身高)2 > a<-cbind(sleepdata,bmi) # 將sleepdata和bmi結合 > a

7 做BMI的敘述統計 為確認我們的資料無誤,利用R中summary&sd的語法,做連續變項之簡單描述性統計分析,檢查BMI值是否在合理的範圍之內。觀察bmi的最小值、第一四分位數、中位數、第三四分位數、最大值 > summary(bmi) # 5個數字的摘要 Min. 1st Qu. Median Mean 3rd Qu. Max > sd(bmi) # 標準差 [1]

8 利用條件式建立新的分組變數 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 資料來源:衛生署食品資訊網/肥胖及體重控制

9 根據原有變數代入條件式建立新變數 範例問題: 將身體質量指數分級,並建立分組變數。 使用方法:
產生一新變數命名為bmi_a,並利用條件式將BMI分組。

10 建立新的分組變數 > 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資料合併

11

12 類別變數之描述性統計 > table(bmi_a) # 建立BMI分組的次數分配表 bmi_a

13 類別變數之描述性統計 另外,也可於R中引入套件prettyR,可同時製作百分比。 > library(prettyR) # 引入prettyR套件 > freq(bmi_a) # 建立次數分配表、百分比 Frequencies for bmi_a NA (次數) % (含NA百分比) %!NA (不含NA百分比)

14 利用條件式建立新的分組變數 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 資料來源:衛生署食品資訊網/肥胖及體重控制

15 根據原有變數代入條件式建立新變數 範例問題: 將BMI分級標準併為過輕、正常及過重或肥胖三組。 使用方法:
產生一新變數命名為bmi_b,根據BMI分級標準(bmi_a)將其重新併組為過輕、正常及過重或肥胖三組。

16 建立新的分組變數 > 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資料合併

17 類別變數之描述性統計 > table(bmi_b) # 建立BMI分組的次數分配表 bmi_b

18 類別變數之描述性統計 另外,也可於R中引入套件prettyR,可同時製作百分比。 > library(prettyR) # 引入prettyR套件 > freq(bmi_b) # 建立次數分配表、百分比 Frequencies for bmi_b NA (次數) % (含NA百分比) %!NA (不含NA百分比)

19 利用日期函數建立年齡變數 利用日期函數ISOdate(year, month, day)
在資料處理中,我們經常會需要處理日期的計算,例如:從以下的訪視日期與個案的出生年、月、日資料去計算個案的年齡;一般統計軟體會提供日期函數,透過年、月、日的代入(此處年、月、日稱為此函數的3個引數)來處理日期的計算,此外,此處所指的”年”為西元年,故若資料為民國的年,則需加1911將之轉換為西元年。

20 利用日期函數建立年齡變數 個案代號 訪視日期 出生日期 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

21 利用日期函數建立年齡變數 範例問題: 利用訪視日期及出生日期來計算個案的年齡。 使用方法:
產生一新變數命名為age,並利用日期函數計算訪視日期及出生日期的差異天數,再轉換為年齡。

22 利用日期函數建立年齡變數 # 計算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/ # 計算年齡 > age Time differences in days [1] [13] [25] [37] [49]

23 定量變數之描述性統計 > age1<-as.numeric(age) # 將年齡轉換成數字類型 > summary(age1) # 計算年齡的5個數字摘要 Min. 1st Qu. Median Mean 3rd Qu. Max > sd(age1) # 計算年齡的標準差 [1] 此50個病人的平均年齡為32歲, 標準差為8.17歲

24 其他常見的函數 常見的統計函數應用: 新變數=統計函數(參數1,參數2,參數3,…) 範例問題:
利用函數來計算數個指定變數(例如:x1,x2,x3分別代表三次考試的成績)的有效樣本個數、遺漏值個數、平均值、變異數、標準差、中位數、變異係數、最大值、最小值等統計值。 使用方法: 產生新變數,並利用統計函數來計算所需要的統計值。

25 無遺漏值 > 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,]

26 無遺漏值 > median1<-median(x1) # 中位數 > cv1<-(x7/x5)*100 # 變異係數CV > max1<-max(x1) # 最大值 > min1<-min(x1) # 最小值 > mean_a<-( )/3 # 以數學式算平均值 > cbind(median1,cv1,max1,min1,mean_a) median1 cv1 max1 min1 mean_a [1,]

27 有遺漏值 # 在有遺漏值的情況下,函數後面需加上 ‘’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,]

28 有遺漏值 # 在有遺漏值的情況下,函數後面需加上 ‘’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,] NA

29 其他常見的函數 常見的數學函數應用: 新變數=數學函數(參數) 範例問題: 從數學運算函數計算所需的數值。 使用方法:
利用常用的數學函數計算所需的值。

30 數學函數 > x3<-c( , ) # 建立變數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,] [2,]

31 數學函數 > x3<-c( , ) > 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,] [2,]

32 其他常見的函數 日期函數的應用: 範例問題: 從文字格式的日期資料中,計算年齡。 使用方法:
利用利用文字萃取函數的日期,獲得部分字串,將其轉換為數值後,再以日期函數計算年齡。

33 日期函數 > 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(資料,開始選取的位置,選取結束的位置)

34 日期函數 # 將以上的文字以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] " :00:00 GMT" > age<-(Sys.time()-b)/ > age Time difference of days # 將所有選取好的數字轉變成日期型式,函數為ISOdate(年,月,日) # Sys.time()函數可以顯是當下的日期,令資料為age將選取好的日期與當下的日期相減得到年齡

35 付出最多的人,也是收穫最多的人 ~共勉之~


Download ppt "R教學 單元3 建立新變數及函數的介紹 羅琪老師."

Similar presentations


Ads by Google