lecture
website icon
新增變數
資料檢視 命名編碼 新增變數 資料合併 資料篩選 遺漏值 資料加權
×
website icon 資料管理 統計分析 相關資源 巨人肩膀 語法索引 關於作者

簡介

本部分介紹新增變數、在R的工作環境中進行變數運算及轉換,使用到的函數包含:

在資料分析的過程中,有時候需要透過將現有的變數作加減乘除,以便創造出另外一個新變數。例如成績加總、平均等。這裡一樣以世界棒球經典賽台灣隊的檔案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