HI,大家好,我是星光。
上一期給大家聊了BYROW函數(shù),末尾留了一個多關(guān)鍵詞查詢的案例,當(dāng)時我們說,當(dāng)計(jì)算對象是單列多行數(shù)據(jù)時,用MAP函數(shù)比BYROW函數(shù)更適合。這期就給大家聊一下MAP函數(shù)。
??點(diǎn)擊圖片閱讀BYROW函數(shù)教程
▎語法概要
1)基礎(chǔ)語法
以下是MAP的語法格式:
=MAP(
數(shù)組,
數(shù)組或LAMBDA自定義表達(dá)式1,
數(shù)組或LAMBDA自定義表達(dá)式2,
……
數(shù)組或LAMBDA自定義表達(dá)式n
)
第1參數(shù)是數(shù)組,第2等參數(shù)是數(shù)組或LAMBDA表達(dá)式。系統(tǒng)按照從上到下、從左到右的順序,遍歷數(shù)組中的每個元素,執(zhí)行LAMBDA表達(dá)式,最后返回和源數(shù)組尺寸相同的結(jié)果數(shù)組。
打個響指,看語法看不出花來,我們還是舉個簡單的例子。
如上圖所示,是一張成績表?,F(xiàn)在,需要對每個人的語文成績加10分。為什么加10分呢?聽說是慶祝祖國即將統(tǒng)一了。
MAP函數(shù)的解法如下:
=MAP(D2:D9,LAMBDA(_m,_m+10))
MAP函數(shù)第1參數(shù)是D2:D9,系統(tǒng)從上到下依次遍歷數(shù)組中的每個元素,也就是D2/D3/D4/...D9,每個元素執(zhí)行LAMBDA表達(dá)式。
LAMBDA表達(dá)式第1參數(shù)屬于自定義名稱(_m),指向第1個數(shù)組中每個被遍歷的元素,第2參數(shù)是計(jì)算方式(_m+10),在原值的基礎(chǔ)上加10。
公式返回結(jié)果如下圖所示。
……
2)遍歷順序
當(dāng)MAP函數(shù)的數(shù)組參數(shù)是多行多列時,會按照從上到下、從左到右的順序遍歷。
還是舉個簡單例子。以同樣的數(shù)據(jù)為例,不但語文要加10分,數(shù)學(xué)也要加10分。嗯,快樂總是相似的。
MAP函數(shù)解法如下:
=MAP(D2:E9,LAMBDA(_m,_m+10))
MAP函數(shù)第1參數(shù)是D2:E9,8行2列。系統(tǒng)按照從上到下、從左到右的順序遍歷該數(shù)組,也就是D2/E2/D3/E3……依次執(zhí)行LAMBDA表達(dá)式,每個元素+10,返回一個和源數(shù)組尺寸相等的結(jié)果數(shù)組,8行2列,如下圖所示:
……
3)多數(shù)組參數(shù)
MAP函數(shù)支持多個數(shù)組作為參數(shù)。
例如,需要計(jì)算每個人的成績總分,MAP函數(shù)解法如下:
=MAP(D2:D9,E2:E9,
LAMBDA(_a,_b,_a+_b))
MAP函數(shù)第1參數(shù)是源數(shù)組1:D2:D9,第2參數(shù)是源數(shù)組2:E2:E9;第3參數(shù)是LAMBDA表達(dá)式。
LAMBDA第1個參數(shù)是自定義名稱(_a)指向源數(shù)組1,第2個自定義名稱(_b)指向源數(shù)組2。系統(tǒng)按順序遍歷源數(shù)組中的每個元素,_a依次指向D2/D3/..D9。_b依次指向E2/E3/..D9,兩者依次相加即為每個人的成績總分。
從這個計(jì)算規(guī)則中,你就可以發(fā)現(xiàn),當(dāng)數(shù)組有多個時,它們的尺寸大小必須一致,不然按照數(shù)組運(yùn)算規(guī)則,會導(dǎo)致配對元素缺失,進(jìn)而產(chǎn)生錯誤值。
……
4)保留引用特性
和BYROW函數(shù)一樣,但源數(shù)組為引用時,MAP也會保留引用的特性。攤手,如果你忘記了什么是引用,最好是重新看下新手教程里的什么是Excel數(shù)據(jù)類型章節(jié)。
舉個簡單的例子。
如上圖所示,需要在G列用動態(tài)數(shù)組的形式,統(tǒng)計(jì)每個班級累加出現(xiàn)的次數(shù)。
MAP函數(shù)參考解法如下:
=MAP(A2:A9,
LAMBDA(_m,COUNTIF(A1:_m,_m)))
MAP第1參數(shù)是引用性質(zhì)的數(shù)組A2:A9,系統(tǒng)遍歷該數(shù)組每個元素,執(zhí)行LAMBDA表達(dá)式。_m指向源數(shù)組被遍歷的元素,比如A2,COUNTIF函數(shù)第1參數(shù)是A1:_m,表示統(tǒng)計(jì)范圍,比如A1:A2,在這個范圍中統(tǒng)計(jì)A2出現(xiàn)的次數(shù)。下一個遍歷元素為A3,_m指向A3,COUNTIF在A1:A3中統(tǒng)計(jì)A3出現(xiàn)的次數(shù)……其余以此類推。
▎實(shí)戰(zhàn)案例
坦白但不露胸說,以上案例,都是簡單的,只是為了表達(dá)MAP函數(shù)的運(yùn)算特點(diǎn),很明顯,它們并非MAP不可。MAP函數(shù)最常用的場景還是將計(jì)算結(jié)果作為內(nèi)存數(shù)組的形式,傳遞給其它函數(shù)。換句話說,它只是一個計(jì)算過程,而非最終結(jié)果。
再舉兩個例子,這兩例子雖然實(shí)際工作中不常見,但計(jì)算過程比較典型。更多實(shí)用的案例,可以參考我們的100道練習(xí)題系列。
1)字符串篩選、拆分與合并
如上圖所示,A列的數(shù)據(jù)混合了班級、姓名和性別等數(shù)據(jù),需要從中獲取男性的名單,并合并成一個字符串。
參考解法如下:
=TEXTJOIN('-',1,
MAP(A2:A9,
LAMBDA(_m,
IF(RIGHT(_m)='男',
INDEX(TEXTSPLIT(_m,'-'),2),
'')
)
)
)
MAP函數(shù)遍歷A2:A9區(qū)域,如果最右邊的字符不為男,則返回假空,否則使用TEXTSPLIT函數(shù)按分隔符'-'將其拆分,再使用INDEX函數(shù)取出姓名。
2)字符串拆分與內(nèi)部計(jì)數(shù)
如下圖所示,A2:A8單元格內(nèi)存在多個人名,不同人名之間使用分隔符'-'相連。
現(xiàn)在需要統(tǒng)計(jì)每個單元格內(nèi)部每個人名累加出現(xiàn)的次數(shù),模擬結(jié)果如下:
MAP函數(shù)參考解法如下,B2單元格輸入以下公式向下復(fù)制填充。
公式看不全可以左右拖動..
=LET(
_a,TEXTSPLIT(A2,'-'),
_b,SEQUENCE(1,COUNTA(_a)),
TEXTJOIN('-',1,
MAP(_a,_b,
LAMBDA(_x,_y,
_x&COUNT(0/((_a=_x)*(_b<=_y)))&'次')
)
)
)
第2行代碼使用TEXTSPLIT函數(shù)將A2單元格按分隔符'-'拆分,并賦值變量_a。
{'看見星光','二肥','超人','看見星光','看見星光'}
第3行代碼統(tǒng)計(jì)數(shù)組_a元素的個數(shù),生成一個遞增水平序列,賦值變量_b。
{1,2,3,4,5}
這個時候,我們就可以假設(shè),得到了一個虛擬的二維數(shù)組,如下圖所示:
然后,我們使用MAP函數(shù),遍歷這個虛擬數(shù)組。
MAP函數(shù)第1參數(shù)為_a,為每個人名元素,第2參數(shù)_b,為水平序列。在LAMBDA表達(dá)式中,使用COUNT函數(shù)統(tǒng)計(jì)所有人名等于當(dāng)前人名,并且所有序列小于等于當(dāng)前序列的個數(shù),也就是每個人名累加出現(xiàn)的次數(shù)。
最后使用TEXTJOIN函數(shù)將結(jié)果合并即可。
……
當(dāng)我們使用了顯性遍歷的函數(shù),諸如MAP/BYROW/SCAN/REDUCE等時,最好使用動態(tài)數(shù)組的形式,一次性返回全部結(jié)果,這可以避免反復(fù)調(diào)取單元格對象到內(nèi)存中,以至于嚴(yán)重拖累計(jì)算速度——這也是我們一直說的,如果WPS不支持動態(tài)數(shù)組,則引入Excel新函數(shù)體系無意義,因?yàn)樗鼔焊鶐Р黄疬@批函數(shù)的計(jì)算速度。
以上述問題為例,如果使用一條函數(shù)公式,返回B列全部計(jì)算結(jié)果,可以在外部嵌套一個REDUCE函數(shù)。在B1單元格輸入以下公式即可:
=REDUCE('數(shù)據(jù)',A2:A8,LAMBDA(_p,_v,
LET(
_a,TEXTSPLIT(_v,'-'),
_b,SEQUENCE(1,COUNTA(_a)),
_c,TEXTJOIN('-',,
MAP(_a,_b,LAMBDA(_x,_y,
_x&COUNT(0/((_a=_x)*(_b<=_y)))&'次')
)),
VSTACK(_p,_c)
)))
……
攤手,今天給大家分享的內(nèi)容就這樣吧,有啥問題照例可以在VIP會員群中提問交流↓↓ 揮揮手,關(guān)于REDUCE函數(shù)的講解,咱們以后的推文中再見。
需要系統(tǒng)學(xué)習(xí)Excel,卻找不到優(yōu)質(zhì)教程?學(xué)習(xí)Excel的過程中遇到疑難問題,卻找不到人及時作出解答?加入我的付費(fèi)社群,與4500+學(xué)員一起,同微軟最有價值專家(MVP)全面精進(jìn)表格之道??
??
聯(lián)系客服