在Knime循环中每次迭代后移除指定行数的实现方案
在Knime里实现循环迭代移除极值行的方法
核心逻辑
用循环结构反复处理数据集,每次迭代都去掉X个Column1最小的样本和X个最大的样本,直到剩下的行数不够再删(也就是行数小于2*X+1)为止,同时把每一轮的结果都存下来。
具体操作步骤(以X=2为例)
1. 导入初始数据
用File Reader或者Table Creator把你的数据集导进来,保证Column1是数值类型就行。
2. 启动循环
拖一个Generic Loop Start节点,把初始数据连进去,这就是循环的起点。
3. 循环体内的核心处理
这部分是关键,要完成极值过滤和循环判断:
- 给行按
Column1排名
加个Rank节点,选Column1作为排名列,排序方向设为升序(从小到大排),排名类型选Unique ranks (1,2,3,...)——哪怕有重复值,每一行的排名都是唯一的,避免删错数量。 - 过滤掉极值行
接一个Row Filter节点,设置过滤条件:
保留排名大于X(比如X=2,就去掉前2个最小的),同时排名小于当前总行数 - X + 1(比如9行的话,9-2+1=8,就去掉排名8、9的两个最大的)的行。 - 判断是否继续循环
加个Row Count节点统计当前行数,再用Rule Engine写判断规则:
把这个判断结果连到$Row Count$ >= 2*2 + 1 => TRUE ELSE => FALSELoop End的"Continue Loop"端口——如果行数够继续删,就返回循环;不够就停止。 - 收集每轮结果
用Loop End节点,勾选"Collect all iterations",这样每一轮的数据集都会被收集起来输出。
4. 查看或导出结果
Loop End输出的就是每一轮的处理结果,你可以用Table View挨个查看,或者用File Writer导出成文件。
对应示例的验证
你给出的9行数据、X=2的情况:
- 第一轮:直接输出原始9行
- 第二轮:去掉排名1、2(0.2、0.5)和8、9(1.9、1.9),剩下5行
- 第三轮:当前5行,去掉排名1、2(0.6、0.7)和4、5(1.3、1.2),剩下排名3的1.2那一行
- 第四轮:只剩1行,小于
2*2+1=5,循环停止
实用小技巧
- 可以把X做成流变量,这样要改移除数量的时候,不用挨个改节点参数,直接调变量值就行
- 如果
Column1重复值多,别用Dense ranks,不然会导致移除的行数不准,Unique ranks更稳妥
内容的提问来源于stack exchange,提问作者iturrizaga
相关产品推荐
相关产品推荐

