Table。ReplaceValue替换重复ID案例
本期案例是将重复出现的ID进行替换,对应的值为ALTID的值,前后转换效果如下:
解题套路
(一)Table。ReplaceValue
1。首先获取当前行对应的位置,通过位置获得包括当前行之前的数据。
深化ID列,筛选与当前行ID相同的项并统计,判断的依据是统计的个数是否为1,个数为1的不变,其他进行替换。
Table。ReplaceValue(源,each〔ALTID〕,eachList。Count(List。Select(Table。FirstN(源,Table。PositionOf(源,)1)〔ID〕,(x)x〔ID〕))1,(x,y,z)ifzthenxelsey,{ID})
2。本案例是对ID的唯一性进行判断,因此这里不需要进行上述相同ID的筛选,只要截取不包括当前行的数据,判断的依据就变成了深化后ID列是否包含当前行ID,包含则进行替换,否则不变。
Table。ReplaceValue(源,each〔ALTID〕,eachList。Contains(Table。FirstN(源,Table。PositionOf(源,))〔ID〕,〔ID〕),(x,y,z)ifzthenyelsex,{ID})
3。另外一种方式也可以扩展下。对源添加索引列,然后依据ID进行分组,对于索引值非最小的ID进行替换,其他保持不变。
Table。RemoveColumns(Table。Sort(Table。Combine(Table。Group(Table。AddIndexColumn(源,index),ID,{a,eachTable。ReplaceValue(,each〔ALTID〕,each〔index〕,(x,y,z)ifzList。Min(〔index〕)thenxelsey,{ID})})〔a〕),index),index)
使用索引可以保持源数据的排序,如果不考虑这个,也可以直接使用位置函数进行转换。
(二)List。Accumulate
该思路与前述唯一性判断类似,ACC第二参数为列表,对应的第二项为ID库,当出现不唯一的时候,对传递的列表进行ID值替换,否则不变。
Table。FromRows(List。Accumulate(Table。ToRows(源),{{},{}},(x,y)ifList。Contains(x{1},y{0})then{x{0}{List。ReplaceRange(y,0,1,{List。Last(y)})},x{1}}else{x{0}{y},x{1}{y{0}}}){0},Table。ColumnNames(源))
以上是本期内容。