龙空技术网

Table.Group 根据条件添加列

可乐之滨 370

前言:

现在咱们对“js往table追加行”大体比较关切,看官们都想要剖析一些“js往table追加行”的相关资讯。那么小编同时在网摘上收集了一些有关“js往table追加行””的相关资讯,希望小伙伴们能喜欢,看官们快快来学习一下吧!

本期案例是对相同的id组,如果col_1满足有三个连续以上为1,则新列的值为1,否则为0。前后转换效果如下:

解题套路

1.Table.Group

解题思路1:先按id进行分组,将col_1列的值深化合并,判断依据是该字符串是否包含“111”,包含则赋值为1,反之赋值为0。最后深化合并,转化为表。

Table.Combine(Table.Group(源,"id",{"a",each Table.AddColumn(_,"col_2",(x)=>if Text.Contains(Text.Combine(List.Transform([col_1],Text.From)),"111") then 1 else 0)})[a])

解题思路2:进行两次分组,第一次按id进行分组,第二次是在组内按col_1进行分组,并对col_1的进行求和,判断的依据转换为列表内的值是否包含3,其余操作同上。

Table.Combine(Table.Group(源,"id",{"a",each Table.AddColumn(_,"col_2",(x)=>if List.Contains(Table.Group(_,"col_1",{"b",(y)=>List.Sum(y[col_1])},0)[b],3) then 1 else 0)})[a])

解题思路3:在分组后,对col_1列的进行合并,将0作为分隔符进行拆分,判断依据是拆分后的列表中,是否包含字符长度在3以上的数据项。

Table.Combine(Table.Group(源,"id",{"a",each Table.AddColumn(_,"col_2",(x)=>if List.AnyTrue(List.Transform(Text.Split(Text.Combine(List.Transform([col_1],Text.From)),"0"),(y)=>Text.Length(y)=3)) then 1 else 0)})[a])

2.Table.SelectRows

解题思路:直接通过筛选相同id的数据表,通过直接深化col_1列进行转换判断。

Table.AddColumn(源,"col_2",each if Text.Contains(Text.Combine(List.Transform(Table.SelectRows(源,(x)=>x[id]=[id])[col_1],Text.From)),"111") then 1 else 0)

该方式是最简便的,Table.Group中的转换都可以在本套路中应用,因之前第一想到的是分组函数,这里就不再展开其他写法。

3.List.Accumulate

解题思路:将col_1的值合并存放于Acc函数第二参数的第四项中,当id不相同时,判断第四项中是否包含字符“111”,然后依据判断对暂存在第二项中的列表逐一进行添加第四项。

Table.FromRows(List.Accumulate(Table.ToRows(源)&{{"@",0,0}},{{},{},"",""},(x,y)=>if x{2}="" or x{2}<>y{0} then {x{0}&List.Transform(x{1},each _&{if Text.Contains(x{3},"111") then 1 else 0}),{y},y{0},Text.From(y{2})} else {x{0},x{1}&{y},x{2},x{3}&Text.From(y{2})}){0},Table.ColumnNames(源)&{"col_2"})

以上是本期内容。

案例素材:链接:提取码:5asz

标签: #js往table追加行