行列转换一般是通过Table.Transpose()实现,事实上List.Zip()与Table类的函数进行搭配也能复制这个操作。现在假设我们需要把Table1转化为Table2:
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
1 | 2 | 3 | 6 |
4 | 5 | 6 | 15 |
7 | 8 | 9 | 24 |
12 | 15 | 18 | 45 |
其实就是为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.
好久没看到更新了,支持 ^ ^
虽然代码挺容易的,但就是这种结构转换自己就是很难想到- -
终于有大佬来更新了,撒花撒花
厉害,这都能想到。
大佬的神思维啊,赞赞赞
我现在有个list集合,然后有一个table里面的一列想跟这个list集合的数值匹配:
类似TABLE: 1A,2A,3A
2B,3B,4B 然后list集合里面有{1A,3C} 然后我想匹配出table里面的1A,2A,3A这条数据,这样怎么做到呢?thanks
不知道你在说什么
附件好像下载不了了,恳请大神有空再帮忙上传一下,谢谢。
已经修复