HI,大家好,我是星光。
之前给大家分享过二维表和一维表的概念;它们各自的优劣;以及如何使用PowerQuery快速实现两者相互转换▼
「Power Query二维表和一维表互转」
今天再给大家分享一下高阶函数的解法一共有4种常用解,大家看哪个顺眼就直接领回家去吧。
如下图所示,A:D列数据源表,是一张标准的二维表,需要转换成F:H列一维表的样式。
解法1:
=TEXTSPLIT(
TEXTJOIN("|",0,A2:A6&"@"&B1:D1&"@"&B2:D6),
"@","|"
)
先将每行的姓名和标题用分隔符"@"合并,再和每行的数据用同样的分隔符"@"合并,返回结果如下:
{
"看见星光@语文@缺考",
"看见星光@数学@罢考",
"看见星光@英语@没考";
}
再使用TEXTJOIN函数用分隔符"|"将所有行数据合并成一个字符串,最后使用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的数据转换为单列,作为新的标题内容。
解法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列的姓名成单列。
解法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」
🚂>>~
超低价Excel终身会员:一次付费
永久迭代学习,学习问题永久答疑
扩展阅读
本文由公众号“Excel星球”首发。
点击阅读原文系统学习Excel!