分析過程中有時候需要透過現有的變數作加減乘除,以便創造另外一個新變數。例如成績加總等。這裡一樣以class.RData當範例來說明。
新增變數
class當中只有name、gender、height三個變數。先透過c()指令增加weight變數:
> weight<-c(51,85,75,44,60,47,56,53,64,69)
當然也可以直接用fix()開啟資料編輯器新增:
> fix(class)
> class
name gender height weight
1 Ariel F 168 51
2 Kevin M 188 85
3 Lewis M 182 75
4 Sarah F 156 44
5 George M 170 60
6 Linda F 158 47
7 Anne F 171 56
8 Emma F 160 53
9 Roger M 168 64
10 Bruce M 174 69
變數運算
假設要計算每個人的BMI(身體質量指數),可以直接在R利用「體重/身高(公尺)2」計算公式,新增一個BMI變數:
> BMI<-class$weight/(class$height/100)^2
> BMI
[1] 18.06973 24.04934 22.64219 18.08021 20.76125 18.82711 19.15119 20.70312
[9] 22.67574 22.79033
再編碼
可以透過R的基本運算功能,將BMI區分為體重過輕、正常體位、體重過重3個尺度:
> BMI_health<-c("") #宣告一個新的BMI_health變數
> BMI_health[BMI<18.5]<-0 #宣告BMI<18.5編碼為0
> BMI_health[BMI>=18.5 & BMI<24]<-1 #宣告18.5≦BMI<24編碼為1
> BMI_health[BMI>=24]<-2 #宣告BMI≦24編碼為2
> table(BMI_health)
BMI_health
0 1 2
2 7 1
利用ordered()配合levels()將數值標籤化:
> BMI_health<-ordered(BMI_health, levels=c(0,1,2), labels=c("uderweight","normal","overweight"))
> table(BMI_health)
BMI_health
uderweight normal overweight
2 7 1
虛變數
如果要設定虛變數,可以善用ifelse()指令,配合psych套件裡的dummy.code()。
變數只分兩個層級
當變數只分為兩個層級,例如性別分為男或女,可以直接用ifelse()先設定0、1,再用dummy.code()指令設定虛變數。
> library(psych)
> gender_dummy<-ifelse(class$gender=="M", 0, 1)
> class<-cbind(class, gender_dummy)
> class$gender_dummy<-dummy.code(class$gender_dummy)
> class
name gender height weight BMI_health gender_dummy.0 gender_dummy.1
1 Ariel F 168 51 uderweight 0 1
2 Kevin M 188 85 overweight 1 0
3 Lewis M 182 75 normal 1 0
4 Sarah F 156 44 uderweight 0 1
5 George M 170 60 normal 1 0
6 Linda F 158 47 normal 0 1
7 Anne F 171 56 normal 0 1
8 Emma F 160 53 normal 0 1
9 Roger M 168 64 normal 1 0
10 Bruce M 174 69 normal 1 0
變數超過兩個層級
當變數層級大於2的時候,例如BMI分為過輕、正常、過重,先用as.data.frame()將變數轉換為資料集,再用dummy.code()指令設定虛變數。
> BMI_health_dummy<-as.data.frame(dummy.code(class$BMI_health))
> class<-cbind(class, BMI_health_dummy)
> class
name gender height weight BMI_health gender_dummy.0 gender_dummy.1 normal uderweight overweight
1 Ariel F 168 51 uderweight 0 1 0 1 0
2 Kevin M 188 85 overweight 1 0 0 0 1
3 Lewis M 182 75 normal 1 0 1 0 0
4 Sarah F 156 44 uderweight 0 1 0 1 0
5 George M 170 60 normal 1 0 1 0 0
6 Linda F 158 47 normal 0 1 1 0 0
7 Anne F 171 56 normal 0 1 1 0 0
8 Emma F 160 53 normal 0 1 1 0 0
9 Roger M 168 64 normal 1 0 1 0 0
10 Bruce M 174 69 normal 1 0 1 0 0