LAMBDA 函式(六):REDUCE

閱讀時間約 6 分鐘

再來介紹最後一個 LAMBDA 輔助函式,REDUCE

「reduce」這詞在中文的意思是「縮減」。在 Google 試算表上,REDUCE 會把範圍中的每個值套用指定的 LAMBDA 函式,把這函式的結果累計到一個累計值裡,最後回傳這個值,像是把一個範圍「縮~」成一個值。

簡單舉個例子,我想把 A 欄位的值累加起來(1 + 2 + 3 + ⋯⋯ + 10),把結果放在 B2 上:

raw-image


就可以用這串 REDUCE 得到 55。

=REDUCE(0, A2:A11, LAMBDA(int, val, int + val))
raw-image


如果你還記得上次介紹的 SCAN,其實 REDUCE 應該就會很好理解了:

  • SCAN 會讀取範圍內的每個值,然後回傳中繼值(移動總計)
  • REDUCE 一樣讀取範圍內的每個值,然後回傳最終的統計。

拿上面 1 加到 10 的例子來說,SCAN 就會回傳這樣的一串值:

1
3
6
10
15
21
28
...

REDUCE 就會直接回傳一個值,也就是最後計算出來的 55。

看到這邊,這功能跟 SUM 的功用其實差不多,但 REDUCE 的可能性不只有這樣!它也可以做按條件算總和(像是 SUMIFS 那樣),但提供了更多可能性。

歡迎來複製這個試算表,一起來練習看看 REDUCE 怎麼操作。




REDUCE 語法

=REDUCE(初始值, 範圍, LAMBDA)
  • 初始值:累計值的初始值,也就是 LAMBDA 在計算累加值之前的初始值。
  • 範圍:要套用 LAMBDA 函式的範圍。
  • LAMBDA:要 REDUCE 套用於範圍內初始值跟範圍的自訂函式。

REDUCE 會一個個把範圍內的值累加,從起始值開始,然後一個個累加,得到最後的值。

至於在寫 LAMBDA 的時候,我習慣把初始值的代號叫做 int(initial 的簡寫),範圍內值的代號叫做 val(value 的簡寫),要寫中文或是其他你喜歡的代號也當然沒問題喔!




REDUCE 範例

拿我們剛剛的加總的例子,試著在 B2 運用 REDUCE 看看:

raw-image


首先是初始值。如果我們只想要讓 A 欄的值加總在一起,那這邊就可以寫 0 沒關係;如果你想要讓 REDUCE 先以某個值開始,之後再加總,你就可以在這指定值。

舉例來說,如果我的初始值寫 0,那就是:

=0 + 1 + 2 + 3 + ... + 10
=55

如果你希望一開始就以 100 作為起點,之後再繼續疊加,那就是:

=100 + 1 + 2 + 3 + ... + 10
=155


再來是範圍,就是想要運算的範圍,毫無懸念就是 A2:A11。所以寫到現在,你的算式應該會是這樣:

=REDUCE(0, A2:A11, 


最後是 LAMBDA!我們先定義代號:

=REDUCE(0, A2:A11, LAMBDA(int, val, 


再來,我們想要讓起始值跟範圍的值相加在一起,所以就是 int + val

=REDUCE(0, A2:A11, LAMBDA(int, val, int + val))


爽快按下 Enter,就會看到 REDUCE 的結果囉:

raw-image




只計算偶數值的累加、只計算奇數值的累加

你可以在 LAMBDA 寫條件給 REDUCE 計算累加值。

比如說,我希望 REDUCE 只計算剛剛範圍內的偶數值。我們先把 REDUCE 寫完:

=REDUCE(0, A2:A11,


接下來,我想交給 IF 去判斷範圍內的值是不是偶數。如果是的話,就累加,如果不是,就不累加,也就是這樣:

=REDUCE(0, A2:A11, LAMBDA(int, val, IF(val 是偶數, int + val, int)))


判斷偶數這件事可以交給 ISEVEN 函式來做。只要把值放到括號裡面,ISEVEN 會回傳 TRUE 或是 FALSETRUE 就是偶數、FALSE 就是奇數了。簡單舉例:

=ISEVEN(10) --> TRUE
=ISEVEN(8) --> TRUE
=ISEVEN(7) --> FALSE


好,那我們把 ISEVENLAMBDA 組裝起來,就會像這樣:

=REDUCE(0, A2:A11, LAMBDA(int, val, IF(ISEVEN(val), int + val, int)))


來看看結果:

raw-image

這樣就完成了。


至於奇數的話,你可以用 ISODD 函式來做判斷。ISODD 會判斷一個數是否是奇數,如果是的話會回傳 TRUE、不是就會回傳 FALSE

也就是,我們把剛剛的 ISEVEN 改成 ISODD,就可以計算奇數值了。像是這樣:

=REDUCE(0, A2:A11, LAMBDA(int, val, IF(ISODD(val), int + val, int)))


看看結果吧!

raw-image


這樣就完成了。接下來介紹幾個可以運用 REDUCE 的場景,提供給你參考!




計算每年漲跌幅後的最終價格

我想要算某商品 2000 年的價格(A2)在經過 C 欄與 D 欄的漲跌幅後,在 2024 年的最終價格是多少:

raw-image

如果要一年一年算的話,可能會這樣:

2000 年:5000
2001 年:5000 * -5%
2002 年:2001 年的價格 * 10%
2003 年:2002 年的價格 * 10%
2004 年:2003 年的價格 * -4%
...
本年的價格:去年的價格 * 漲跌幅​


這個就可以用 REDUCE 可以累加的特性來處理了。先彙整一下我們的需求:

  • 初始值A2,2000 年的價格。
  • 範圍D2:D,漲跌幅度的所在範圍。

再來看看 LAMBDA 怎麼寫。我們想要讓它從 2000 年的初始值開始,把初始值加上它乘上漲跌幅的價格就可以了,像是這樣:

=REDUCE(A2, D2:D, LAMBDA(int, val, int + int * val))


來試試看在 F2 上寫這個算式,看看結果:

raw-image


這樣就算得出最後的價格了!




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

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

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

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



avatar-img
14.2K會員
148內容數
簡潔,快速,有效, 讓你的日常生活、工作生產力大提升! ___ 快按「加入」,馬上追蹤所有喜特先生的更新,有 Google 試算表教學、Google Apps Script 的研究、數據分析課程的開箱,還有 Google 試算表疑難雜症的解題分享唷!💪
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
喜特先生官方沙龍 的其他內容
接下來介紹 LAMBDA 函式的第四個輔助函式,SCAN! 「scan」在這邊可以翻成「掃描」,而 SCAN 的作用在於對範圍中的每個值進行「掃描」、累計運算,會回傳一個範圍,裡面的數字是每個計算步驟的中繼值;而它最常見的用法就是算「移動總計」(running total)。
Google 試算表有個叫做 SPARKLINE 的函式,可以讓你在一個儲存格內生成一張迷你圖表。我寫了一篇系列文提供了教學,歡迎來看看唷!
接續著上次提到的 COUNT、COUNTA,我們再稍稍延伸一點,把 COUNT 函式的家族補完,介紹最後的兩名成員:COUNTUNIQUE 跟 COUNTBLANK。
這是「按條件算OO」系列文的第五篇教學!今天會來聊聊 MINIFS。
這是「按條件算OO」系列文的第四篇教學!今天會來聊聊 MAXIFS。
接下來介紹 LAMBDA 函式的第四個輔助函式,SCAN! 「scan」在這邊可以翻成「掃描」,而 SCAN 的作用在於對範圍中的每個值進行「掃描」、累計運算,會回傳一個範圍,裡面的數字是每個計算步驟的中繼值;而它最常見的用法就是算「移動總計」(running total)。
Google 試算表有個叫做 SPARKLINE 的函式,可以讓你在一個儲存格內生成一張迷你圖表。我寫了一篇系列文提供了教學,歡迎來看看唷!
接續著上次提到的 COUNT、COUNTA,我們再稍稍延伸一點,把 COUNT 函式的家族補完,介紹最後的兩名成員:COUNTUNIQUE 跟 COUNTBLANK。
這是「按條件算OO」系列文的第五篇教學!今天會來聊聊 MINIFS。
這是「按條件算OO」系列文的第四篇教學!今天會來聊聊 MAXIFS。
你可能也想看
Google News 追蹤
Thumbnail
題目敘述 Minimum Deletions to Make String Balanced 給定一個只會有包含'a'b或'b'的輸入字串s。 每次操作可以任選一個字元刪除。 請問最少需要多少次操作,才會使得所有的'b'都在'a'後面? 測試範例 Example 1: Input: s
(略),array 是用來將陣列的值進行累加,我們來看看怎麼怎麼達成吧: Given an integer array nums, a reducer function fn, and an initial value init, return the final result obtained
Thumbnail
題目敘述 題目會給定一個鏈結串列的起始點,要求我們把其中區間總和為0的部分刪除掉。 例如 1→ 2 → -2 → 3 → 4 裡面有一段是2 → -2 區間總和為零,所以簡化刪除後變成 1→ 3 → 4 題目的原文敘述 測試範例 Example 1: Input: head
Thumbnail
如果我只是想要重複做一些很簡單的運算,還有沒有更簡潔的方式,那就是Lambda匿名函式。 本文將介紹 : Lambda匿名函式的用法,也比較跟自定函式的差異之處。 結合map,filter,sorted函式做應用介紹
Thumbnail
題目敘述 Minimum Deletions to Make String Balanced 給定一個只會有包含'a'b或'b'的輸入字串s。 每次操作可以任選一個字元刪除。 請問最少需要多少次操作,才會使得所有的'b'都在'a'後面? 測試範例 Example 1: Input: s
(略),array 是用來將陣列的值進行累加,我們來看看怎麼怎麼達成吧: Given an integer array nums, a reducer function fn, and an initial value init, return the final result obtained
Thumbnail
題目敘述 題目會給定一個鏈結串列的起始點,要求我們把其中區間總和為0的部分刪除掉。 例如 1→ 2 → -2 → 3 → 4 裡面有一段是2 → -2 區間總和為零,所以簡化刪除後變成 1→ 3 → 4 題目的原文敘述 測試範例 Example 1: Input: head
Thumbnail
如果我只是想要重複做一些很簡單的運算,還有沒有更簡潔的方式,那就是Lambda匿名函式。 本文將介紹 : Lambda匿名函式的用法,也比較跟自定函式的差異之處。 結合map,filter,sorted函式做應用介紹