杭州亞運在 10 月 8 號閉幕了!台灣國手精銳盡出,成績非常亮眼,奪金牌數也平了隊史紀錄:
說到獎牌,在比較國家與國家間的運動表現時,獎牌榜有個排名(下圖第一欄):
這排名是怎麼排的?觀察一下會發現:
舉例來說:
這次中國的奪金數最多,排名就是第一了。
再看這張泰國和巴林的比較:
泰國和巴林雖然奪金數一樣(12),但是泰國的奪銀數比巴林多(14 > 3),所以泰國排在巴林前面,顯示第 8 名、第 9 名。
再看這張菲律賓、吉爾吉斯跟沙烏地阿拉伯的比較:
三國的金銀牌奪牌數都一樣(4、2),但菲律賓有 12 面銅牌、吉爾吉斯有 9 面、沙烏地阿拉伯有 4 面,所以就按照奪銅數多少決定名次(12 > 9 > 4),所以分別是第 17 名、第 18 名和第 19 名。
再看這張,尼泊爾、汶萊和阿曼的比較:
三國的金銀銅奪牌數都完全一樣(0、1、1),所以同名,並列第 32 名。
所以排名並不是看總奪牌數,而是看各獎牌的奪牌數,以「金」、「銀」、「銅」的優先順序進行排名。
好!問題來了,假如今天要用試算表來做,有這樣的清單:
要怎麼在試算表上顯示排名、要怎麼把這清單排序排好?像這樣:
這是怎麼做的?歡迎點這邊,複製一份試算表,一起來練習看看吧!
上面提到的規則是「先用奪金數排序、再用奪銀數排序、最後再用奪銅數排序」,而這種有優先順序的排序法,可以用 Google 試算表的「排序範圍」功能達成。來一起看看怎麼做!先選 A 欄到 D 欄:
畫面上方的選單有「資料」,在這選「排序範圍」>「範圍排序進階選項」:
這樣會看到一個小視窗:
因為我們的資料有標題列(第一列),「資料包含標題列」要打勾:
接下來就要套用剛剛的金、銀、銅牌的規則了。
我們把排序依據的下拉式選單打開,改成「金牌」:
選完後,右手邊有個「A 到 Z」還有「Z 到 A」又是什麼意思呢?他們代表「遞增」與「遞減」排序。
遞增:小 → 大
遞減:大 → 小
假如你有 1、3、2、4、5 這些數字,我們用兩種排序方式去排的話:
除了數字,排序也當然可以用在文字上,以英文來說就是字母順序了。
假如你有 A、C、B、D、E 這五個字母,一樣用兩種排序方式去排:
目前在你的視窗有「A 到 Z」還有「Z 到 A」這兩個選項,「A 到 Z」就是遞增,「Z 到 A」就是遞減囉。
(至於中文和其他語言是怎麼排序的,就⋯⋯就是另一個深奧的話題了⋯⋯,或許會在另外一篇教學解釋不同語種的排序,歡迎敲碗。)
回到正題!因為我們要讓奪金數高的出現在前面(大 → 小),也就是遞減的方式,所以我們要選「Z 到 A」。目前的小視窗會看起來像這樣:
再來繼續設定銀牌和銅牌的排序就 OK 了!這邊點「新增其他排序欄」:
這邊會出現「次要排序依據」,還有預設的選項是「銀牌」(如果你的畫面跟我不一樣,在下拉選單選「銀牌」即可)。這邊一樣選遞減(Z 到 A):
再來設定「銅牌」。我們再點一次「新增其他排序欄」,確認下拉選單顯示「銅牌」,然後也用遞減(Z 到 A)排序。
設定到這邊,應該會是這樣:
按下綠色按鈕「排序」,就搞定了!
再來看看怎麼做排名。
把排序好的工作表往下滑,你會發現有幾個代表團的各獎牌奪牌數完全一樣:
如果各獎牌奪牌數都一樣,那應該要並列同名才對。
可是如果你想直接把排序後的第一個代表團當作第一名、第二個就是第二名、第三個就是第三名,以此類推,你會發現這好像不是我們要的:
比對一開始在維基百科看到的排行:
雖然是可以手動改成同一個名次,但如果今天有更多的代表團參加比賽的話,這樣應該會有點辛苦。還有沒有什麼方法呢?
有的!我們等等會用「加權分數」跟「RANK
」函式來解決這個問題。開始之前,先幫我在 D 欄右邊再新增兩欄,把 E 欄的標題叫「加權分數」、把 F 欄的標題叫「排名」 :
剛剛提到了 RANK
函式,那我就在這先說明一下。RANK
可以傳回在某資料範圍裡面,一個數值的排名是多少。
RANK
的構造也很簡單:
=RANK(數值, 資料範圍, [遞增或遞減])
B2:B
、C2:C50
0
(遞減)這個「遞減或遞增」,可以填 0
或 1
:
0
表示遞減,意思是最大的數值就會排第一名,這也是我們對排名的定義。1
表示遞增,也就是最小的數值會排第一名。因為預設值其實就是我們要的,這邊如果沒有什麼需求都不必特別指名。
舉個簡單的例子:
C 欄這邊就是用 RANK
做的。在 C2
我寫的是:
=RANK(B2, $B$2:$B)
拆解一下:
B2
(要排名的數值)B2:B
(要排名的資料範圍)因為 B2
的 90 分在 B 欄(B2:B
)裡面是第二高的,所以就回傳「2」了。
那麼,回到獎牌排名!雖然我們知道 RANK
怎麼用了,但是:
數值該寫什麼?資料範圍又該寫什麼?
你會發現目前我們還沒有一組數值可直接給資料範圍比對,奪金數、奪銀數、奪銅數、甚至總奪牌數都不適合。面對這種多條件的排名,我們需要一點點額外的幫助。
既然我們沒有可以比對的數值,那就自己做一組!
我想到可以把各代表團的奪金數、奪銀數、奪銅數拿來加權,給它們不同的比重,然後再相加起來,得到一組「加權分數」,像這樣:
加權分數 = 金牌奪牌數 * 10000 + 銀牌奪牌數 * 100 + 銅牌奪牌數
舉例來說:
中華台北代表團:19 金 20 銀 28 銅
19 * 10000 + 20 * 100 + 28 = 192028
試試看相同奪金數的狀況:
泰國代表團:12 金 14 銀 32 銅
12 * 10000 + 14 * 100 + 32 = 121432
巴林代表團:12 金 3 銀 5 銅
12 * 10000 + 3 * 100 + 5 = 120305
奪牌數完全相同的狀況:
阿曼代表團:1 銀 1 銅
尼泊爾代表團:1 銀 1 銅
汶萊代表團:1 銀 1 銅
三團都是:1 * 100 + 1 = 101
為什麼金牌要乘上一萬,銀牌要乘上一百?其他數字不行嗎?我覺得只要加權的獎牌倍率夠明顯,什麼數字都可以。
假如金牌的倍率是 3,銀牌是 2 來試算看看:
伊朗代表團:13 金 21 銀 20 銅
13 * 3 + 21 * 2 + 20 = 101
哈薩克代表團:10 金 22 銀 48 銅
10 * 3 + 22 * 2 + 48 = 122
雖然伊朗的奪金數較多(13),但分數上卻比奪金數較少的哈薩克低(10),這樣等等排名的時候,哈薩克反而會在伊朗前面,這樣就不是我們要的效果了。
所以如果可以試著調整比率,讓各種獎牌的比率變多就可以,一萬和一百只是我嘗試出來的數字而已,你可以彈性變換唷!
那我們就按照這個算法,把算式打在加權分數那邊吧。在 E2
輸入:
=B2 * 10000 + C2 * 100 + D2
然後按下 Enter,第二列有加權分數了。如果你有出現下圖的自動填入,按下勾勾交給試算表在下方其他列產生算式:
如果沒有出現,你也可以用 ArrayFormula
函式來做,在 E2
打:
=ArrayFormula(B2:B * 10000 + C2:C * 100 + D2:D)
做到這步,你的工作表看起來會像這樣:
最後我們用剛剛學到的 RANK
函式,在 F 欄製作排名就可以了。
我們在 F2
輸入:
=RANK(E2, E2:E)
E2
(要排名的數值)E2:E
(要排名的資料範圍)如果你打完這個之後有出現自動填入,可以直接按下勾勾,讓算式往下填滿;或是如果你想做 ArrayFormula 的話,一樣可以在 E2 輸入:
=ArrayFormula(RANK(E2:E, E2:E))
這樣就做好了:
來看看同名的代表團有沒有好好呈現:
可以看到這些代表團有被分在同一個名次了!以下用顏色分組表示:
這樣就做完囉!
如果你喜歡這次的文章,歡迎你透過這些方法支持我:
想要看更多文章,歡迎來到我的 Notion 頁面找找有沒有你需要的資源喔!
我是喜特先生,Mr. Sheet,我們下個教學見!