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