當資料量過於龐大時,篩選可以萃取出需要的資料,簡化分析工作。這項工作在SPSS、Excel中是透過if函數來完成,SAS則是透過keep或drop進行資料篩選。 R 的操作在沒有任何函數協助下,可以直接透過[Row, Column]索引的方法,可以快速篩選出指定的資料。
篩選個案 / 列篩選
就如同Excel儲存格一樣, R 也可以透過列(Row)與欄(Column)來辨識資料位置。[第X列,第X欄]是 R 索引資料的標準格式,例如[4,3]代表的是第4列第3欄,列與欄之間用逗號分隔,索引用中括弧表示。連續的列或欄則用冒號來表示連續資料。這裡同樣以wbc.csv作為範例來說明。
依據[Row, Column]原則,[5:9,]表示篩選第5筆至第9筆個案,也就是第5列到第9列。逗號後空白代表沒有指定欄位。如此可以篩選出Team_Taiwan第五位到第九位球員:
> Team_Taiwan[5:9,] #篩選出第五位到第九位球員
PLAYER PS G H AB PA HR RBI BB SO SB OBP TB SLG OPS
5 陳傑憲 OF 2 0 1 3 0 0 1 0 0 0.667 0 0.000 0.667
6 陳晨威 OF 4 3 13 15 0 3 1 3 2 0.267 4 0.308 0.575
7 吉力吉撈 C 4 1 9 12 0 0 2 4 0 0.333 1 0.111 0.444
8 江坤宇 IF 4 2 12 14 0 2 1 2 1 0.231 2 0.167 0.398
9 吳念庭 IF 4 2 11 11 0 0 0 3 0 0.182 2 0.182 0.364
除用數字表示欄位之外,也可以直接用變數名稱來篩選。但要注意符合[Row, Column]索引原則,列與欄中間的逗號不能省略:
> Team_Taiwan[PS=="OF",] #篩選出守備位置是外野手的球員
PLAYER PS G H AB PA HR RBI BB SO SB OBP TB SLG OPS
2 Fairchild OF 4 3 12 16 2 6 4 5 3 0.438 9 0.750 1.188
5 陳傑憲 OF 2 0 1 3 0 0 1 0 0 0.667 0 0.000 0.667
6 陳晨威 OF 4 3 13 15 0 3 1 3 2 0.267 4 0.308 0.575
10 宋晟睿 OF 3 0 6 7 0 0 1 4 0 0.143 0 0.000 0.143
11 林安可 OF 4 1 15 15 0 0 0 4 0 0.067 1 0.067 0.134
如果要做複合條件式的篩選,可以用「&」與「|」設定篩選交集與聯集。例如篩選出至少有一支安打或一分打點的內野手:
> Team_Taiwan[PS=="IF" & (H>=1 | RBI>=1),] #篩選出至少有一支安打或一分打點的內野手
PLAYER PS G H AB PA HR RBI BB SO SB OBP TB SLG OPS
1 鄭宗哲 IF 4 3 9 15 1 2 5 1 4 0.571 6 0.667 1.238
3 張育成 IF 4 6 15 16 1 5 1 2 0 0.438 9 0.600 1.038
8 江坤宇 IF 4 2 12 14 0 2 1 2 1 0.231 2 0.167 0.398
9 吳念庭 IF 4 2 11 11 0 0 0 3 0 0.182 2 0.182 0.364
也可以用「%in%」符號搭配 c() 函數來篩選非連續個案:
> Team_Taiwan[H %in% c(1,6),] #篩選打出一支安打與六支安打的球員
PLAYER PS G H AB PA HR RBI BB SO SB OBP TB SLG OPS
3 張育成 IF 4 6 15 16 1 5 1 2 0 0.438 9 0.600 1.038
4 林家正 C 4 1 7 10 0 0 1 1 0 0.400 2 0.286 0.686
7 吉力吉撈 C 4 1 9 12 0 0 2 4 0 0.333 1 0.111 0.444
11 林安可 OF 4 1 15 15 0 0 0 4 0 0.067 1 0.067 0.134
篩選變數 / 欄篩選
篩選變數一樣依循[Row, Column]索引原則。[,7:8]代表篩選第7欄到第8欄的資料,此時逗號前面為空白,代表不需要指定列(Row)資料。如此可以篩選出全壘打與打點:
> Team_Taiwan[,7:8] #篩選第七欄與第八欄
HR RBI
1 1 2
2 2 6
3 1 5
4 0 0
5 0 0
6 0 3
7 0 0
8 0 2
9 0 0
10 0 0
11 0 0
12 0 0
13 0 0
14 0 0
有各式方法可以篩選球員、全壘打與打點,包含指定變數欄位、指定變數名稱,或者可以用減法刪去不要的欄位:
> Team_Taiwan[,c(1,7,8)]
> Team_Taiwan[,c("PLAYER","HR","RBI")] #名稱記得要加引號
> Team_Taiwan[, -c(2:6, 9:15)] #用減法刪除不要的變數
PLAYER HR RBI
1 鄭宗哲 1 2
2 Fairchild 2 6
3 張育成 1 5
4 林家正 0 0
5 陳傑憲 0 0
6 陳晨威 0 3
7 吉力吉撈 0 0
8 江坤宇 0 2
9 吳念庭 0 0
10 宋晟睿 0 0
11 林安可 0 0
12 蔣少宏 0 0
13 林子偉 0 0
14 張政禹 0 0
NULL可以刪除變數:
> G<-NULL
篩選個案與變數
subset() 函數提供一個更簡便的方法篩選個案與變數的子集合。例如篩選出本屆世界棒球經典賽長打率在0.55以上,同時攻擊指數也在1以上的關鍵打者,用「&」設立交集條件:
> subset(Team_Taiwan, SLG>=0.55 & OPS>=1, select=c("PLAYER","SLG","OPS"))
PLAYER SLG OPS
1 鄭宗哲 0.667 1.238
2 Fairchild 0.750 1.188
3 張育成 0.600 1.038
使用「&」與「|」設定交集與聯集條件,用 subset() 篩選出至少有一支安打或一分打點的內野手:
> subset(Team_Taiwan, (PS=="IF" & H>=1) | (PS=="IF" & RBI>=1), select=c(1,4,8))
PLAYER PS G H AB PA HR RBI BB SO SB OBP TB SLG OPS
1 鄭宗哲 IF 4 3 9 15 1 2 5 1 4 0.571 6 0.667 1.238
3 張育成 IF 4 6 15 16 1 5 1 2 0 0.438 9 0.600 1.038
8 江坤宇 IF 4 2 12 14 0 2 1 2 1 0.231 2 0.167 0.398
9 吳念庭 IF 4 2 11 11 0 0 0 3 0 0.182 2 0.182 0.364
隨機篩選
sample() 可以對變數作隨機抽樣。例如隨機抽出3名球員,抽出不放回:
> sample(PLAYER, size=3, replace=F)
[1] "江坤宇" "林子偉" "林家正
從資料中隨機篩選3個個案,重複選取:
> Team_Taiwan[sample(1:nrow(Team_Taiwan), size=3, replace=T),]
PLAYER PS G H AB PA HR RBI BB SO SB OBP TB SLG OPS
9 吳念庭 IF 4 2 11 11 0 0 0 3 0 0.182 2 0.182 0.364
11 林安可 OF 4 1 15 15 0 0 0 4 0 0.067 1 0.067 0.134
4 林家正 C 4 1 7 10 0 0 1 1 0 0.400 2 0.286 0.686
dplyr 套件
篩選資料不得不提由Hadley Wickham開發的 dplyr 套件。 dplyr 提供選取、篩選、分組、排序等功能,讓 R 更隨心所欲地管理資料。
dplyr套件包含下列功能:
—select():篩選欄位Column
—filter():篩選個案Row
—mutate():增加新欄位
—group_by():分組
—arrange():排序
—rename():重新命名
要使用上述功能,必須先載入 dpylr 套件。
> library(dplyr)
select()
select() 用來選取欄位。語法為 select(資料名稱, 選取條件1, 選取條件2) 。也可以配合 starts_with() 、 ends_with() 、 contains() 、 mathces() 、 num_range() 等函數來設定篩選條件。
> select(Team_Taiwan, PLAYER, PS)
PLAYER PS
1 鄭宗哲 IF
2 Fairchild OF
3 張育成 IF
4 林家正 C
5 陳傑憲 OF
6 陳晨威 OF
7 吉力吉撈 C
8 江坤宇 IF
9 吳念庭 IF
10 宋晟睿 OF
11 林安可 OF
12 蔣少宏 C
13 林子偉 IF
14 張政禹 IF
filter()
filter() 用來選取列,使用方法與 select() 相同。
> filter(Team_Taiwan, PS=="OF") #篩選出守備位置是外野手的球員
PLAYER PS G H AB PA HR RBI BB SO SB OBP TB SLG OPS
2 Fairchild OF 4 3 12 16 2 6 4 5 3 0.438 9 0.750 1.188
5 陳傑憲 OF 2 0 1 3 0 0 1 0 0 0.667 0 0.000 0.667
6 陳晨威 OF 4 3 13 15 0 3 1 3 2 0.267 4 0.308 0.575
10 宋晟睿 OF 3 0 6 7 0 0 1 4 0 0.143 0 0.000 0.143
11 林安可 OF 4 1 15 15 0 0 0 4 0 0.067 1 0.067 0.134
也可以以直接在 filter() 中直接做運算。
> filter(Team_Taiwan, ((H/AB)>0.3)) #計算打擊率並篩選出超過3成的球員
PLAYER PS G H AB PA HR RBI BB SO SB OBP TB SLG OPS
1 鄭宗哲 IF 4 3 9 15 1 2 5 1 4 0.571 6 0.667 1.238
2 張育成 IF 4 6 15 16 1 5 1 2 0 0.438 9 0.600 1.038
mutate()
mutate() 可以增加新變數。
> AVG<-mutate(Team_Taiwan, AVG=round(H/AB, digit=3)) #新增打擊率
> AVG
PLAYER PS G H AB PA HR RBI BB SO SB OBP TB SLG OPS AVG
1 鄭宗哲 IF 4 3 9 15 1 2 5 1 4 0.571 6 0.667 1.238 0.333
2 Fairchild OF 4 3 12 16 2 6 4 5 3 0.438 9 0.750 1.188 0.250
3 張育成 IF 4 6 15 16 1 5 1 2 0 0.438 9 0.600 1.038 0.400
4 林家正 C 4 1 7 10 0 0 1 1 0 0.400 2 0.286 0.686 0.143
5 陳傑憲 OF 2 0 1 3 0 0 1 0 0 0.667 0 0.000 0.667 0.000
6 陳晨威 OF 4 3 13 15 0 3 1 3 2 0.267 4 0.308 0.575 0.231
7 吉力吉撈 C 4 1 9 12 0 0 2 4 0 0.333 1 0.111 0.444 0.111
8 江坤宇 IF 4 2 12 14 0 2 1 2 1 0.231 2 0.167 0.398 0.167
9 吳念庭 IF 4 2 11 11 0 0 0 3 0 0.182 2 0.182 0.364 0.182
10 宋晟睿 OF 3 0 6 7 0 0 1 4 0 0.143 0 0.000 0.143 0.000
11 林安可 OF 4 1 15 15 0 0 0 4 0 0.067 1 0.067 0.134 0.067
12 蔣少宏 C 4 0 3 4 0 0 0 1 0 0.000 0 0.000 0.000 0.000
13 林子偉 IF 1 0 3 3 0 0 0 1 0 0.000 0 0.000 0.000 0.000
14 張政禹 IF 2 0 2 2 0 0 0 0 0 0.000 0 0.000 0.000 0.000
group_by()
group_by() 通常搭配 summarize() 、 reframe() 等函數一起使用,並配合%>%可以達到資料分組的功能。
> Team_Taiwan %>% group_by(PLAYER) %>% summarize(H)
# A tibble: 14 × 2
PLAYER H
1 Fairchild 3
2 吉力吉撈 1
3 吳念庭 2
4 宋晟睿 0
5 張政禹 0
6 張育成 6
7 林子偉 0
8 林安可 1
9 林家正 1
10 江坤宇 2
11 蔣少宏 0
12 鄭宗哲 3
13 陳傑憲 0
14 陳晨威 3
> Team_Taiwan %>% group_by(PS)%>%reframe(PLAYER)
# A tibble: 14 × 2
PS PLAYER
1 C 林家正
2 C 吉力吉撈
3 C 蔣少宏
4 IF 鄭宗哲
5 IF 張育成
6 IF 江坤宇
7 IF 吳念庭
8 IF 林子偉
9 IF 張政禹
10 OF Fairchild
11 OF 陳傑憲
12 OF 陳晨威
13 OF 宋晟睿
14 OF 林安可
arrange()
預設是升冪排序,配合 desc() 可以做降冪排序。
> arrange(Team_Taiwan, OPS) #攻擊指數升冪排序
PLAYER PS G H AB PA HR RBI BB SO SB OBP TB SLG OPS
1 蔣少宏 C 4 0 3 4 0 0 0 1 0 0.000 0 0.000 0.000
2 林子偉 IF 1 0 3 3 0 0 0 1 0 0.000 0 0.000 0.000
3 張政禹 IF 2 0 2 2 0 0 0 0 0 0.000 0 0.000 0.000
4 林安可 OF 4 1 15 15 0 0 0 4 0 0.067 1 0.067 0.134
5 宋晟睿 OF 3 0 6 7 0 0 1 4 0 0.143 0 0.000 0.143
6 吳念庭 IF 4 2 11 11 0 0 0 3 0 0.182 2 0.182 0.364
7 江坤宇 IF 4 2 12 14 0 2 1 2 1 0.231 2 0.167 0.398
8 吉力吉撈 C 4 1 9 12 0 0 2 4 0 0.333 1 0.111 0.444
9 陳晨威 OF 4 3 13 15 0 3 1 3 2 0.267 4 0.308 0.575
10 陳傑憲 OF 2 0 1 3 0 0 1 0 0 0.667 0 0.000 0.667
11 林家正 C 4 1 7 10 0 0 1 1 0 0.400 2 0.286 0.686
12 張育成 IF 4 6 15 16 1 5 1 2 0 0.438 9 0.600 1.038
13 Fairchild OF 4 3 12 16 2 6 4 5 3 0.438 9 0.750 1.188
14 鄭宗哲 IF 4 3 9 15 1 2 5 1 4 0.571 6 0.667 1.238
> arrange(Team_Taiwan, desc(OPS)) #攻擊指數降冪排序
PLAYER PS G H AB PA HR RBI BB SO SB OBP TB SLG OPS
1 鄭宗哲 IF 4 3 9 15 1 2 5 1 4 0.571 6 0.667 1.238
2 Fairchild OF 4 3 12 16 2 6 4 5 3 0.438 9 0.750 1.188
3 張育成 IF 4 6 15 16 1 5 1 2 0 0.438 9 0.600 1.038
4 林家正 C 4 1 7 10 0 0 1 1 0 0.400 2 0.286 0.686
5 陳傑憲 OF 2 0 1 3 0 0 1 0 0 0.667 0 0.000 0.667
6 陳晨威 OF 4 3 13 15 0 3 1 3 2 0.267 4 0.308 0.575
7 吉力吉撈 C 4 1 9 12 0 0 2 4 0 0.333 1 0.111 0.444
8 江坤宇 IF 4 2 12 14 0 2 1 2 1 0.231 2 0.167 0.398
9 吳念庭 IF 4 2 11 11 0 0 0 3 0 0.182 2 0.182 0.364
10 宋晟睿 OF 3 0 6 7 0 0 1 4 0 0.143 0 0.000 0.143
11 林安可 OF 4 1 15 15 0 0 0 4 0 0.067 1 0.067 0.134
12 蔣少宏 C 4 0 3 4 0 0 0 1 0 0.000 0 0.000 0.000
13 林子偉 IF 1 0 3 3 0 0 0 1 0 0.000 0 0.000 0.000
14 張政禹 IF 2 0 2 2 0 0 0 0 0 0.000 0 0.000 0.000
rename()
rename(資料,新名稱=舊名稱) 可以重新命名變數。
> rename(Team_Taiwan, K=SO) #把三振SO替換成K
PLAYER PS G H AB PA HR RBI BB K SB OBP TB SLG OPS
1 鄭宗哲 IF 4 3 9 15 1 2 5 1 4 0.571 6 0.667 1.238
2 Fairchild OF 4 3 12 16 2 6 4 5 3 0.438 9 0.750 1.188
3 張育成 IF 4 6 15 16 1 5 1 2 0 0.438 9 0.600 1.038
4 林家正 C 4 1 7 10 0 0 1 1 0 0.400 2 0.286 0.686
5 陳傑憲 OF 2 0 1 3 0 0 1 0 0 0.667 0 0.000 0.667
6 陳晨威 OF 4 3 13 15 0 3 1 3 2 0.267 4 0.308 0.575
7 吉力吉撈 C 4 1 9 12 0 0 2 4 0 0.333 1 0.111 0.444
8 江坤宇 IF 4 2 12 14 0 2 1 2 1 0.231 2 0.167 0.398
9 吳念庭 IF 4 2 11 11 0 0 0 3 0 0.182 2 0.182 0.364
10 宋晟睿 OF 3 0 6 7 0 0 1 4 0 0.143 0 0.000 0.143
11 林安可 OF 4 1 15 15 0 0 0 4 0 0.067 1 0.067 0.134
12 蔣少宏 C 4 0 3 4 0 0 0 1 0 0.000 0 0.000 0.000
13 林子偉 IF 1 0 3 3 0 0 0 1 0 0.000 0 0.000 0.000
14 張政禹 IF 2 0 2 2 0 0 0 0 0 0.000 0 0.000 0.000