Table.ReplaceValue 数据补全案例
本期案例是将缺失部分数据进行补全,前后转换效果如下图1、图2:
解题步骤:
1.用第一行数据进行举例,需要补足Balance的数据,其实就是要找到两个位置,三个数据(图3):一个是当前行在源表中的位置,一个是Balance列第一个数据不为空的位置,这两个位置之间对应的Debit、Credit、Balance三个数据根据逻辑关系进行作差,就是最终需要的数据(Balance-Credit-Debit)。
2.当前行所在的位置y的计算,可以直接通过第二参数进行计算(图4)。
3.接着需要计算从当前行往后数,出现第一个Balance不为空的位置。深化源表中的Balance列,先移除当前行所在位置之前的行数,然后再移除不为空的数据,那么排在第一位的就是不为空的数据,然后再根据该数据进行位置判断(图5)。
这里我们需要获取的是对应的位置,因此这里可以使用Table.Skip,这样深化获取的刚好是记录,可以直接使用Table.PositionOf获取位置(图6)。
4.获取两个位置直接对应的表数据,考虑到后续还需使用到位置数据,这里可以使用参数进行传递(图7)。
这里要为什么不用Table.Range,n计算的结果是位置,而不是数量,如果使用Table.Range,则获得不是对应的数据。另外需要注意的一点,要先进行获取表,在进行移除,这个还是和位置有关,可以理解下。
5.接下来就是要计算对应的差值。前面也提到,需要计算三列的差值(Balance-Credit-Debit)。那这里可以考虑先将Balance列都转换为负值,然后通过列合并,使用求和函数,最后再添加一个负号,是否也是个思路(图8)。
转换代码:Table.ReplaceValue(源,each Table.PositionOf(源,_),0,(x,y,z)=>if x=null then let n=Table.PositionOf(源,Table.Skip(Table.Skip(源,y),each [Balance]=null){0}),tab=Table.TransformColumns(Table.Skip(Table.FirstN(源,n+1),y+1),{"Balance",each -_}) in -List.Sum(List.Combine(List.Range(Table.ToColumns(tab),1,3))) else x,{"Balance"})
通过验算,结果符合要求。