通过List.Zip()实现行列转换

行列转换一般是通过Table.Transpose()实现,事实上List.Zip()与Table类的函数进行搭配也能复制这个操作。现在假设我们需要把Table1转化为Table2:

123
456
789
(Table1)
1236
45615
78924
12151845
(Table2)

    其实就是为Table1添加行与列的总和,使用Table.Transpose()与Table.AddColumn()的组合,4个步骤能够实现:

let
    AddCol1= Table.AddColumn( Table1, "Rsubotal", each List.Sum( Record.FieldValues(_) ), Int64.Type ),
    TransposeTo = Table.Transpose( AddCol1 ),
    AddCol2 = Table.AddColumn( TransposeTo, "Csubtotal", each List.Sum( Record.FieldValues(_) ), Int64.Type ),
    Table2 = Table.Transpose( AddCol2 )
in
    Table2

如果使用List.Zip(),可以通过以下2个组合实现:

组合一,

let
    ToColumns = Table.ToColumns( Table1 ),
    SumByCol = List.Transform( ToColumns, each _ & { List.Sum(_) } ),
    Zipping = List.Zip( SumByCol ),
    SumByRow = List.Transform( Zipping, each _ & { List.Sum(_) } ),
    Table2 = Table.FromRows( SumByRow )
in
    Table2

组合二,

let
    ToRows = Table.ToRows( Table1 ),
    SumByR = List.Transform( ToRows, each _ & { List.Sum(_) } ),
    Zipping = List.Zip( SumByR ),
    SumByC = List.Transform( Zipping, each _ & { List.Sum(_) } ),
    Table2 = Table.FromColumns( SumByC )
in
    Table2

要把Table1转换成Table2, 首先需要用Table.ToRows()[Table.ToColumns()]把Table1以行[]为单位分解为多个内嵌的串列,然后通过List.Transform()与List.Sum()构造带有行[]总和的串列组。这些新的串列将会通过List.Zip()现实行列转换,之后再次运用List.Transform()与List.Sum()构造带有列[]总和的串列组。最后,使用Table.FromColumns()[Table.FromRows()]就能够把串列组还原为Table2.

8 Replies to “通过List.Zip()实现行列转换”

  1. 好久没看到更新了,支持 ^ ^
    虽然代码挺容易的,但就是这种结构转换自己就是很难想到- -

  2. 我现在有个list集合,然后有一个table里面的一列想跟这个list集合的数值匹配:
    类似TABLE: 1A,2A,3A
    2B,3B,4B 然后list集合里面有{1A,3C} 然后我想匹配出table里面的1A,2A,3A这条数据,这样怎么做到呢?thanks

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注