在資料分析的過程中,有時候需要透過將現有的變數作加減乘除,以便創造出另外一個新變數。例如成績加總、平均等。這裡一樣以世界棒球經典賽台灣隊的檔案wbc.csv當範例來說明。
新增變數
Team_Taiwan當中有安打(H)、打數(AB)、全壘打(HR)、打點(RBI)、上壘率(OBP)等打擊成績,但卻沒有長打率(Slugging Percentage, SLG)。根據棒球公式長打率=壘打數÷打數,代表打者每個打數平均能貢獻多少個壘包。假設我們想瞭解每位選手的長打率,必須先透過 c() 函數新增每位選手的壘打數(Total Bases, TB):
> TB<-c(6,9,9,2,0,4,1,2,2,0,1,0,0,0) #新增每位選手的壘打數
當然也可以直接用fix()開啟資料編輯器新增:
> fix(Team_Taiwan)
變數運算
有了壘打數後,可以直接利用壘打數÷打數計算長打率:
> SLG<-round(TB/AB, digit=3) #計算長打率,四捨五入取到小數第三位
> SLG
[1] 0.667 0.750 0.600 0.286 0.000 0.308 0.111 0.167 0.182 0.000 0.067 0.000
[13] 0.000 0.000
有了長打率之後,要計算攻擊指數(On-Base Plus Slugging, OPS)就簡單了。根據棒球公式,攻擊指數=上壘率+長打率。
> OPS<-OBP+SLG #計算每位選手的攻擊指數
> OPS
[1] 1.238 1.188 1.038 0.686 0.667 0.575 0.444 0.398 0.364 0.143 0.134 0.000
[13] 0.000 0.000
再編碼
透過基本運算,可以再將長打率分為普通與優秀2個等級。首先先將長打率予以編碼:
> SLG_Index<-c("") #宣告一個新的SLG_Index變數
> SLG_Index[SLG<0.55]<-0 #長打率低於0.55編碼為0
> SLG_Index[SLG>=0.55]<-1 #長打率超過0.55編碼為1
> table(SLG_Index)
SLG_Index
0 1
11 3
利用ordered()配合levels()將編碼數值標籤化。可以得知這次經典賽短期賽事中,共有三名選手的長打率大於0.55表現優秀。
> SLG_Index<-ordered(SLG_Index, levels=c(0,1), labels=c("Normal", "Good"))
> table(SLG_Index)
SLG_Index
Normal Good
11 3
同樣的概念,可以將攻擊指數分為普通、良好、優秀三個等級予以編碼標籤化。
> OPS_Index<-c("") #宣告一個新的OPS_Index變數
> OPS_Index[OPS<=0.6]<-0 #攻擊指數低於0.6編碼為0
> OPS_Index[OPS>0.6 & OPS<0.9]<-1 #攻擊指數介於0.6到0.9之間編碼為1
> OPS_Index[OPS>=0.9]<-2 #攻擊指數超過0.9編碼為2
> OPS_Index<-factor(OPS_Index, levels=c(0,1,2), labels=c("Normal", "Good", "Great"))
> table(OPS_Index)
OPS_Index
Normal Good Great
9 2 3
虛變數
如果要設定虛變數,可以善用 ifelse() 條件函數或是 psych 套件裡的 dummy.code() 函數。
當變數編碼只分為兩個層級時,例如SLG_Index只有普通與優秀兩個層級,可以直接用 ifelse(test, yes, no) 條件函數來設定虛變數。
> SLG_Index_N<-ifelse(SLG_Index=="Normal", 1, 0) #SLG_Index是Normal編碼為1,否則為0
> SLG_Index_G<-ifelse(SLG_Index=="Good", 1, 0) #SLG_Index是Good編碼為1,否則為0
> SLG_Index_N
[1] 0 0 0 1 1 1 1 1 1 1 1 1 1 1
> SLG_Index_G
[1] 1 1 1 0 0 0 0 0 0 0 0 0 0 0
如果不要那麼麻煩, psych 套件裡的 dummy.code() 函數提供更快速的方法。只不過 dummy.code() 輸出的資料格式是矩陣,需要再透過 as.data.frame() 函數將資料結構轉換為資料集以便後續進行分析。
> library(psych)
> dummy.code(SLG_Index)
Normal Good
[1,] 0 1
[2,] 0 1
[3,] 0 1
[4,] 1 0
[5,] 1 0
[6,] 1 0
[7,] 1 0
[8,] 1 0
[9,] 1 0
[10,] 1 0
[11,] 1 0
[12,] 1 0
[13,] 1 0
[14,] 1 0
將虛變數矩陣轉換為資料集:
> SLG_Index_Dummy<-as.data.frame(dummy.code(SLG_Index))
> SLG_Index_Dummy
Normal Good
1 0 1
2 0 1
3 0 1
4 1 0
5 1 0
6 1 0
7 1 0
8 1 0
9 1 0
10 1 0
11 1 0
12 1 0
13 1 0
14 1 0
同樣的概念,可以如法炮製直接使用 dummy.code() 函數設定攻擊指數OPS_Index的虛變數。
> OPS_Index_Dummy<-as.data.frame(dummy.code(OPS_Index))
> OPS_Index_Dummy
Normal Great Good
1 0 1 0
2 0 1 0
3 0 1 0
4 0 0 1
5 0 0 1
6 1 0 0
7 1 0 0
8 1 0 0
9 1 0 0
10 1 0 0
11 1 0 0
12 1 0 0
13 1 0 0
14 1 0 0