獎牌榜問題:怎麼排序與排名

2023/10/15閱讀時間約 9 分鐘

杭州亞運在 10 月 8 號閉幕了!台灣國手精銳盡出,成績非常亮眼,奪金牌數也平了隊史紀錄:

raw-image

說到獎牌,在比較國家與國家間的運動表現時,獎牌榜有個排名(下圖第一欄):

raw-image

這排名是怎麼排的?觀察一下會發現:

  • 奪金數越多,排名越前
  • 若兩國奪金數相同,則比較奪銀數,銀牌多者,排名排前面
  • 若兩國奪金數、奪銀數相同,則比較奪銅數,銅牌多者,排名排前面
  • 若兩國金、銀、銅奪牌數相同,則同名

舉例來說:

raw-image

這次中國的奪金數最多,排名就是第一了。

再看這張泰國和巴林的比較:

raw-image

泰國和巴林雖然奪金數一樣(12),但是泰國的奪銀數比巴林多(14 > 3),所以泰國排在巴林前面,顯示第 8 名、第 9 名。

再看這張菲律賓、吉爾吉斯跟沙烏地阿拉伯的比較:

raw-image

三國的金銀牌奪牌數都一樣(4、2),但菲律賓有 12 面銅牌、吉爾吉斯有 9 面、沙烏地阿拉伯有 4 面,所以就按照奪銅數多少決定名次(12 > 9 > 4),所以分別是第 17 名、第 18 名和第 19 名。

再看這張,尼泊爾、汶萊和阿曼的比較:

raw-image

三國的金銀銅奪牌數都完全一樣(0、1、1),所以同名,並列第 32 名。

所以排名並不是看總奪牌數,而是看各獎牌的奪牌數,以「金」、「銀」、「銅」的優先順序進行排名。




好!問題來了,假如今天要用試算表來做,有這樣的清單:

raw-image

要怎麼在試算表上顯示排名、要怎麼把這清單排序排好?像這樣:

raw-image

這是怎麼做的?歡迎點這邊,複製一份試算表,一起來練習看看吧!




排序

上面提到的規則是「先用奪金數排序、再用奪銀數排序、最後再用奪銅數排序」,而這種有優先順序的排序法,可以用 Google 試算表的「排序範圍」功能達成。來一起看看怎麼做!先選 A 欄到 D 欄:

raw-image

畫面上方的選單有「資料」,在這選「排序範圍」>「範圍排序進階選項」:

raw-image

這樣會看到一個小視窗:

raw-image

因為我們的資料有標題列(第一列),「資料包含標題列」要打勾:

raw-image

接下來就要套用剛剛的金、銀、銅牌的規則了。

我們把排序依據的下拉式選單打開,改成「金牌」:

raw-image

選完後,右手邊有個「A 到 Z」還有「Z 到 A」又是什麼意思呢?他們代表「遞增」與「遞減」排序。




遞增、遞減是什麼?

遞增:小 → 大
遞減:大 → 小

假如你有 1、3、2、4、5 這些數字,我們用兩種排序方式去排的話:

  • 遞增:1、2、3、4、5(小 → 大)
  • 遞減:5、4、3、2、1(大 → 小)

除了數字,排序也當然可以用在文字上,以英文來說就是字母順序了。

假如你有 A、C、B、D、E 這五個字母,一樣用兩種排序方式去排:

  • 遞增:A、B、C、D、E
  • 遞減:E、D、C、B、A

目前在你的視窗有「A 到 Z」還有「Z 到 A」這兩個選項,「A 到 Z」就是遞增,「Z 到 A」就是遞減囉。

(至於中文和其他語言是怎麼排序的,就⋯⋯就是另一個深奧的話題了⋯⋯,或許會在另外一篇教學解釋不同語種的排序,歡迎敲碗。)




回到正題!因為我們要讓奪金數高的出現在前面(大 → 小),也就是遞減的方式,所以我們要選「Z 到 A」。目前的小視窗會看起來像這樣:

raw-image

再來繼續設定銀牌和銅牌的排序就 OK 了!這邊點「新增其他排序欄」:

raw-image

這邊會出現「次要排序依據」,還有預設的選項是「銀牌」(如果你的畫面跟我不一樣,在下拉選單選「銀牌」即可)。這邊一樣選遞減(Z 到 A):

raw-image

再來設定「銅牌」。我們再點一次「新增其他排序欄」,確認下拉選單顯示「銅牌」,然後也用遞減(Z 到 A)排序。

設定到這邊,應該會是這樣:

raw-image

按下綠色按鈕「排序」,就搞定了!

raw-image

再來看看怎麼做排名。




排名

把排序好的工作表往下滑,你會發現有幾個代表團的各獎牌奪牌數完全一樣:

raw-image
  • 1 銀 1 銅:阿曼、尼泊爾、汶萊
  • 3 銅:寮國、伊拉克
  • 1 銅:柬埔寨、敘利亞、巴勒斯坦、黎巴嫩

如果各獎牌奪牌數都一樣,那應該要並列同名才對。

可是如果你想直接把排序後的第一個代表團當作第一名、第二個就是第二名、第三個就是第三名,以此類推,你會發現這好像不是我們要的:

raw-image

比對一開始在維基百科看到的排行:

raw-image

雖然是可以手動改成同一個名次,但如果今天有更多的代表團參加比賽的話,這樣應該會有點辛苦。還有沒有什麼方法呢?

有的!我們等等會用「加權分數」跟「RANK」函式來解決這個問題。開始之前,先幫我在 D 欄右邊再新增兩欄,把 E 欄的標題叫「加權分數」、把 F 欄的標題叫「排名」 :

raw-image




RANK 函式是什麼?

剛剛提到了 RANK 函式,那我就在這先說明一下。RANK 可以傳回在某資料範圍裡面,一個數值的排名是多少。

RANK 的構造也很簡單:

=RANK(數值, 資料範圍, [遞增或遞減])

  • 數值:要排名的數值,像是某人考試的總分數、某人賽跑的總秒數
  • 資料範圍:要排名的資料範圍(通常是一欄),像是 B2:BC2:C50
  • [遞減或遞增]:選填,預設值是 0(遞減)

這個「遞減或遞增」,可以填 01

  • 0 表示遞減,意思是最大的數值就會排第一名,這也是我們對排名的定義。
  • 1 表示遞增,也就是最小的數值會排第一名。

因為預設值其實就是我們要的,這邊如果沒有什麼需求都不必特別指名。

舉個簡單的例子:

raw-image

C 欄這邊就是用 RANK 做的。在 C2 我寫的是:

=RANK(B2, $B$2:$B)

拆解一下:

  • 數值:B2(要排名的數值)
  • 資料範圍:B2:B(要排名的資料範圍)

因為 B2 的 90 分在 B 欄(B2:B)裡面是第二高的,所以就回傳「2」了。




那麼,回到獎牌排名!雖然我們知道 RANK 怎麼用了,但是:

數值該寫什麼?資料範圍又該寫什麼?

你會發現目前我們還沒有一組數值可直接給資料範圍比對,奪金數、奪銀數、奪銅數、甚至總奪牌數都不適合。面對這種多條件的排名,我們需要一點點額外的幫助。


「加權分數」

既然我們沒有可以比對的數值,那就自己做一組!

我想到可以把各代表團的奪金數、奪銀數、奪銅數拿來加權,給它們不同的比重,然後再相加起來,得到一組「加權分數」,像這樣:

加權分數 = 金牌奪牌數 * 10000 + 銀牌奪牌數 * 100 + 銅牌奪牌數​

舉例來說:

中華台北代表團:192028
19 * 10000 + 20 * 100 + 28 = 192028

試試看相同奪金數的狀況:

泰國代表團:121432
12 * 10000 + 14 * 100 + 32 = 121432

巴林代表團:1235 銅​
12 * 10000 + 3 * 100 + 5 = 120305

奪牌數完全相同的狀況:

阿曼代表團:11
尼泊爾代表團:11
汶萊代表團:11

三團都是:1 * 100 + 1 = 101


為什麼金牌要乘上一萬,銀牌要乘上一百?其他數字不行嗎?我覺得只要加權的獎牌倍率夠明顯,什麼數字都可以。

假如金牌的倍率是 3,銀牌是 2 來試算看看:

伊朗代表團:132120
13 * 3 + 21 * 2 + 20 = 101

哈薩克代表團:102248
10 * 3 + 22 * 2 + 48 = 122

雖然伊朗的奪金數較多(13),但分數上卻比奪金數較少的哈薩克低(10),這樣等等排名的時候,哈薩克反而會在伊朗前面,這樣就不是我們要的效果了。

所以如果可以試著調整比率,讓各種獎牌的比率變多就可以,一萬和一百只是我嘗試出來的數字而已,你可以彈性變換唷!

那我們就按照這個算法,把算式打在加權分數那邊吧。在 E2 輸入:

=B2 * 10000 + C2 * 100 + D2
raw-image

然後按下 Enter,第二列有加權分數了。如果你有出現下圖的自動填入,按下勾勾交給試算表在下方其他列產生算式:

raw-image

如果沒有出現,你也可以用 ArrayFormula 函式來做,在 E2 打:

=ArrayFormula(B2:B * 10000 + C2:C * 100 + D2:D)

做到這步,你的工作表看起來會像這樣:

raw-image


「RANK」產生排名

最後我們用剛剛學到的 RANK 函式,在 F 欄製作排名就可以了。

我們在 F2 輸入:

=RANK(E2, E2:E)
raw-image
  • 數值E2(要排名的數值)
  • 資料範圍E2:E(要排名的資料範圍)

如果你打完這個之後有出現自動填入,可以直接按下勾勾,讓算式往下填滿;或是如果你想做 ArrayFormula 的話,一樣可以在 E2 輸入:

=ArrayFormula(RANK(E2:E, E2:E))

這樣就做好了:

raw-image

來看看同名的代表團有沒有好好呈現:

raw-image

可以看到這些代表團有被分在同一個名次了!以下用顏色分組表示:

raw-image

這樣就做完囉!




如果你喜歡這次的文章,歡迎你透過這些方法支持我:

  • 按下愛心、按下儲存
  • 留言告訴我你的想法
  • 加入喜特先生的官方沙龍,即時看到我發布的教學
  • 付費訂閱喜特先生的官方沙龍,加入每月小額訂閱方案
  • 追蹤喜特先生的 Facebook
  • 這邊小額贊助我的創作!

想要看更多文章,歡迎來到我的 Notion 頁面找找有沒有你需要的資源喔!

我是喜特先生,Mr. Sheet,我們下個教學見!



4.8K會員
139內容數
簡潔,快速,有效, 讓你的日常生活、工作生產力大提升! ___ 快按「加入」,馬上追蹤所有喜特先生的更新,有 Google 試算表教學、Google Apps Script 的研究、數據分析課程的開箱,還有 Google 試算表疑難雜症的解題分享唷!💪
留言0
查看全部
發表第一個留言支持創作者!