本期案例是根据和累计项进行同类项填充,前后转换效果如下图:
解题步骤
1.这里采用Table.Group第五参数进行分组。拿第二组进行举例,当前x传递的是730,要取得除当前项外的所有数据之和等于730。用List.PositionOf判断730在源“Count”列所在的位置,然后删除该位置之前的数据项获得新list作为List.Range第一参数,再将当前传递的y值在新list中的位置作为List.Range的第三参数,对获得的列进行求和与x进行比对作为分组的依据:
Table.Group(源,"Count",{"a",each _},0,(x,y)=>Number.From([A=源[Count],B=List.Skip(A,List.PositionOf(A,x)+1),C=x=List.Sum(List.Range(B,0,List.PositionOf(B,y)))][C]))
2.接下来操作就简单了,可以用新增列再重排序列的方式对子表进行转换:
Table.Group(源,"Count",{"a",each Table.ReorderColumns(Table.RenameColumns(Table.AddColumn(Table.Skip(_),"RowLabels A",(x)=>Table.FirstValue(_)),{"Row Labels","RowLabels B"}),{"Row Labels A","Row LabelsB","Count"})},0,(x,y)=>Number.From([A=源[Count],B=List.Skip(A,List.PositionOf(A,x)+1),C=x=List.Sum(List.Range(B,0,List.PositionOf(B,y)))][C]))
或者用填充的方式:
Table.Group(源,"Count",{"a",each Table.FillDown(Table.FromColumns({{Table.FirstValue(_)}}&Table.ToColumns(Table.Skip(_)),{"RowLabels A","Row Labelse B","Count"}),{"Row LabelsA"})},0,(x,y)=>Number.From([A=源[Count],B=List.Skip(A,List.PositionOf(A,x)+1),C=x=List.Sum(List.Range(B,0,List.PositionOf(B,y)))][C]))
3.深化合并:
Table.Combine(Table.Group(源,"Count",{"a",each Table.FillDown(Table.FromColumns({{Table.FirstValue(_)}}&Table.ToColumns(Table.Skip(_)),{"RowLabels A","Row Labelse B","Count"}),{"Row LabelsA"})},0,(x,y)=>Number.From([A=源[Count],B=List.Skip(A,List.PositionOf(A,x)+1),C=x=List.Sum(List.Range(B,0,List.PositionOf(B,y)))][C]))[a])
4.List.Accumulate扩展下:
Table.Combine(List.Transform(List.Accumulate(Table.ToRows(源),{{},{},0},(x,y)=>if x{2}=0 then {x{0},x{1}&{y},y{1}} else if x{2}-y{1}>0 then{x{0},x{1}&{y},x{2}-y{1}} else {x{0}&{x{1}&{y}},{},0}){0},each Table.FromRows(List.Transform(_,(x)=>{_{0}{0}}&x),{"Row LabelsA","Row Labels B","Count"})))
以上是本期记录。