二维表转一维表,高阶函数常用的四种解法套路

职场   职场   2024-12-03 07:58   福建  
 戳蓝字Excel星球关注我哦。


HI,大家好,我是星光。


之前给大家分享过二维表和一维表的概念;它们各自的优劣;以及如何使用PowerQuery快速实现两者相互转换▼


「Power Query二维表和一维表互转」


今天再给大家分享一下高阶函数的解法一共有4种常用解,大家看哪个顺眼就直接领回家去吧。



如下图所示,A:D列数据源表,是一张标准的二维表,需要转换成F:H列一维表的样式。




解法1:


公式看不全可以左右拖动..▼
=TEXTSPLIT(  TEXTJOIN("|",0,A2:A6&"@"&B1:D1&"@"&B2:D6),  "@","|")

先将每行的姓名和标题用分隔符"@"合并,再和每行的数据用同样的分隔符"@"合并,返回结果如下:


{  "看见星光@语文@缺考",  "看见星光@数学@罢考",  "看见星光@英语@没考"; }

再使用TEXTJOIN函数用分隔符"|"将所有行数据合并成一个字符串,最后使用TEXTSPLIT函数用分隔符"|"拆成多行,每行再用分隔符"@"拆成多列即可。


更多TEXTSPLIT函数的扩展用法,可以参考我们往期推文:TEXTSPLIT


解法2:


公式看不全可以左右拖动..▼
=GROUPBY(  A2:A6,  B2:D6,  IF({1,0},SINGLE,TOCOL(B1:D1)),  0,0)

第4行公式是GROUPBY函数的第3参数,也就是值区域块的聚合方式。它是一个二维数组,SINGLE表示各列返回原值,TOCOL(B1:D1)将B1:D1的数据转换为单列,作为新的标题内容。


GROUPBY第3参数的运算机制,可以参考我们往期推文:GROUPBY


解法3:


公式看不全可以左右拖动..▼
=LET(  _姓名,TOCOL(IF(LEN(B2:D6)+1,A2:A6)),  _科目,TOCOL(IF(LEN(B2:D6)+1,B1:D1)),  _值,TOCOL(B2:D6),  HSTACK(_姓名,_科目,_值))

第2行公式根据值区域A2:D6的元素个数,扩展A列的姓名成单列。


第3行公式根据值区域A2:D6元素的个数,扩展第一行的标题成单列。

第4行公式将值区域A2:D6转换为单列。

第5行公式将三列数据合并。

TOCOL的相关及扩展用法更详细的解读,可以参考我们往期推文:TOCOL&TORWO


解法4:


公式看不全可以左右拖动..▼
=REDUCE(  {"姓名","科目","成绩"},  B2:D6,  LAMBDA(    _x,_y,    VSTACK(      _x,      HSTACK(        INDEX(A:A,ROW(_y),0),        INDEX(1:1,COLUMN(_y)),        _y      )    )  ))

前面三种解法,要么借助了某个函数的特性,要么借助了数组运算,而这第4种解法是直来直去的迭代。


使用REDUCT函数迭代B2:D6区域每一个元素,并根据元素的位置,使用INDEX函数读取A列的姓名和第一行的标题,用HSTACK函数合并成一行数据,再用VSTACK函数合并成一张多行的表。


这种解法虽然字符最多,但也最具有扩展性,不论是单行表头,或者多行表头,又或者在转换的过程对值区域做筛选等操作,都可以在迭代时直接解决掉。


换而言之,前面三种解法你都可以忘掉,记得万能的REDUCE就好。


如果您需要了解更多REDUCE函数的运算过程,可以参考我们往期推文:REDUCE


~

~

没了,有啥不明白的地方可以在VIP会员微信群中提问交流,遇到所有关于Excel的问题都可以在群内提问,不要不好意思,你其实也是替其它同样不明白却不好意思提问的陌生人发问,你是冥冥之中的好心人


挥挥手,下期再见。



需要系统学习Excel,却找不到优质教程?学习Excel的过程中遇到疑难问题,却找不到人及时作出解答?

加入我的付费社群,学习+训练+答疑,与6000+在线会员一起,同微软最有价值专家MVP同行,全面精进Excel之道

🚂>>~

超低价Excel终身会员:一次付费

永久迭代学习,学习问题永久答疑


扩展阅读



 Excel.VBA常用代码合集
 WPS.JSA宏常用代码合集
• 从Excel出发带你轻松学会SQL

本文由公众号“Excel星球”首发。

点击阅读原文系统学习Excel!

Excel星球
微软全球最有价值专家(Excel MVP),上千篇原创图文和视频教程随学随用,随用随查,建议常用Excel的职场人关注。
 最新文章