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

簡介

本部分介紹如何篩選、過濾資料,使用到的函數包含:

當資料量過於龐大時,篩選可以萃取出需要的資料,簡化分析工作。這項工作在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