LAMBDA 函式(四):BYROW、BYCOL

2024/04/16閱讀時間約 6 分鐘

接著想要一口氣介紹兩個類似的 LAMBDA 輔助函式:BYROWBYCOL

「row」跟「col」(column 的縮寫)在 Google 試算表分別是「列」與「欄」,這邊的「by」可翻成「每⋯⋯」的意思,所以你可以把它們兩個函式理解成:

  • BYROW:在指定範圍的逐列套用 LAMBDA 函式
  • BYCOL:在指定範圍的逐欄套用 LAMBDA 函式

我們常在這些地方用 BYROWBYCOL

  • 跟聚集函式配合SUMAVERAGECOUNT / COUNTAMAXMIN):計算每列或是每欄的聚集結果。
  • 篩選數據、格式化數據:可以逐列依照條件篩選文字、數字,又或是讓它們以某種格式顯示。這效用類似於 MAP

老樣子,歡迎來這邊領取練習用的試算表,一起來實作看看!




BYROW 語法、BYCOL 語法

=BYROW(範圍, LAMBDA)
=BYCOL(範圍, LAMBDA)
  • 範圍:要套用 LAMBDA 函式的範圍。這邊只能填一個,不能有多個。
  • LAMBDA:要 BYROWBYCOL 套用於範圍內每列或每欄的自訂函式。

看得出這兩個函式語法很接近!另外給你一個小技巧:

  • BYROW 函式的結果會「往下長」
  • BYCOL 函式的結果會「往右長」




BYROW 範例

我想先舉個 BYROW 的例子,一起來看看語法怎麼寫吧。

假如我想一口氣計算 A 欄的各店家第一季到第四季營收(B 欄到 E 欄)的總和(E 欄):

raw-image

我要先指定計算的範圍,也就是 B2E4

=BYROW(B2:E4, 

接下來就是 LAMBDA 了。我想取每列的總和,所以代號取 row(表「列」的意思),再用 SUM 把它包起來:

=BYROW(B2:E4, LAMBDA(row, SUM(row))

這樣就一口氣算好了!

raw-image


如果不用 BYROW⋯⋯

要達到一樣這種一口氣的效果,或許要借助 ArrayFormula 的力量:

=ArrayFormula(B2:B + C2:C + D2:D + E2:E)
raw-image

不過看起來沒那麼理想。一來是它會產生很多 0,可能得再用其他方法才可以消去 0(像是 IF 或是 ARRAY_CONSTRAIN 限制顯示的結果),二來是這串「B2:B + C2:C + D2:D + E2:E」看起來不漂亮,萬一有很多欄要加總的話,也挺花時間的。

你也可以在開頭寫 SUM 來算整列,然後再手動向下拉:

=SUM(B2:E2)

但這樣就多了一步,且工作表內的算式就會變多,會影響管理跟效能。


所以這就是 BYROWBYCOL 常常會和聚集函式在一起用的一大原因!

我把這個結果放在「BYROW 範例」工作表,你可以參考看看。




BYCOL 範例

BYCOL 也是類似的使用場景,只是變成逐欄計算。舉例來說,我們用同一組資料,來算「每季最高營收」是多少:

raw-image


我們在 B2BYCOL 起頭:

=BYCOL(

範圍一樣是 B2E4

=BYCOL(B2:E4, 

最後定義 LAMBDA 要如何計算。我想取每欄的最大值,所以代號取 col(表「欄」的意思),再用 MAX 把它包起來:

=BYCOL(B2:E4, LAMBDA(col, MAX(col)))

來看看結果:

raw-image

這樣就搞定啦!


我們最後來看一個比較複雜一點的 BYROW 場景。



勤學徽章與加油徽章:用指定條件對每列做分類

假設你是一位班導師。最後一次段考結束了,你收到了每個學生每科的成績。你要基於下面的條件,給學生兩種徽章來鼓勵同學:

  • 勤學徽章:各科平均超過 80 分。
  • 加油徽章:各科平均低於 60 分,且每科都低於 60 分。

這是成績單,我們要在 G 欄寫產生出結果:

raw-image


好!來試著寫看看吧。我們先釐清一下需求:

  • 範圍:B2:F31
  • LAMBDA:這邊要做多條件的判定(判斷是勤學徽章、加油徽章以及兩者皆非),所以會用到 IFSIFNA。要計算平均值就會用到 AVERAGE,要找最大值就是 MAX

因為要對每列做判斷,所以選擇以 BYROW 開頭:

=BYROW(

範圍就是 B2F31

=BYROW(B2:F31, 

再來是 LAMBDA。我們要讓 LAMBDA 運算每列,所以用「row」作為代號:

=BYROW(B2:F31,
LAMBDA(row,

(因為想到等等的 LAMBDA 可能會寫很長,就先斷行了。你可以用 Ctrl/Cmd + Enter 在算式間斷行)

我們要對每列成績做多條件判斷,且需要顧慮到有兩者皆非的可能性,所以先寫 IFNAIFS

=BYROW(B2:F31,
LAMBDA(row, IFNA(IFS(

到這裡就可以開始寫條件了:

  • 如果各科平均超過 80 分,就是勤學徽章
  • 如果各科平均低於 60 分,且每科都低於 60 分,就是加油徽章。

翻譯成算式,就會像這樣:

=BYROW(B2:F31,
LAMBDA(row, IFNA(IFS(AVERAGE(row) > 80, "勤學徽章",
AND(AVERAGE(row) < 60, MAX(row) < 60), "加油徽章"))))


我們在 G2 執行看看:

raw-image

完成!


這種利用 IFSANDOR 配合、篩選分類數據的方法,也是另一個 BYROWBYCOL 的常用場景,可以跨過 ArrayFormula 對特定函式無法套用的障礙。




在做數據分析的時候,我們往往見到比較「長」的表格,也就是列數較多、欄數較少的表格,所以實務上我比較常用 BYROW 來解決這類批次聚集運算、或是分類數據的問題。BYCOL 在「寬」表格當然也很好用,把 BYROW 學會了,你就可以輕鬆學會 BYCOL




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

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

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

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



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