如何高效地在指定范围的数据中找到满足要求的第一个位置?例如,Big Class.jmp
计算步骤为:
if(row()>30,contains(:height[Index(1,30)],abs(:height[Index(1,30)]-:height)<3))
如果行数大于 30,
将数据与第1--30行的高度与该行的高度小于等于2的绝对值差值进行比较,首先计算满足上述条件的第1--30行的数量。

谢谢专家!
脚本Re: 如何在指定范围的数据中高效找到满足要求的第一个位置?感谢专家的帮助。 通过对这些方法的研究,我知道了更有效的方法。Re: 如何在指定范围的数据中高效找到满足要求的第一个位置?如果我正确理解了这个问题,这可能会起作用(使用 Loc 和矩阵下标):
If(Row() > 30,
m = Loc(Abs((:height << get as matrix)[1::30] - :height) < 3, 1);
If(N Items(m) > 0,
m[1],
.
)
);
大类的完整示例:
查看更多...Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt << New Column("pos", Numeric, Continuous, Formula(
If(Row() > 30,
m = Loc(Abs((:height << get as matrix)[1::30] - :height) < 3, 1);
If(N Items(m) > 0,
m[1],
.
)
);
)); Re: 如何在指定范围的数据中高效找到满足要求的第一个位置?你好@lwx228 ,
我不确定这是否比您的公式更好,但这是做同样事情的另一种方法(我认为)。请注意,对于较大的表,这会很慢;如果您要处理很多行,我可以创建一个查找表,其中所需的行号与所有可能的高度值相对应,然后将其加入表中。

If( Row() > 30,
firstrowmatch = 0;
For( r = 1, r <= 30 & firstrowmatch == 0, r++,
mtch = Contains( Index( :height - 2, :height + 2, 1 ), :height[r] );
If( mtch > 0,
firstrowmatch = r
);
);
firstrowmatch;
)
Re: 如何在指定范围的数据中高效找到满足要求的第一个位置?这个笨方法我试过了,结果出来了。请问专家这个公式可以简化吗?
谢谢!
If( Row() > 30,
r1 = Contains( height[Index( 1, 30 )], height + 2 );
r2 = Contains( height[Index( 1, 30 )], height + 1 );
r3 = Contains( height[Index( 1, 30 )], height );
r4 = Contains( height[Index( 1, 30 )], height - 1 );
r5 = Contains( height[Index( 1, 30 )], height - 2 );
Min( If( r1 == 0, 99, r1 ), If( r2 == 0, 99, r2 ), If( r3 == 0, 99, r3 ), If( r4 == 0, 99, r4 ), If( r5 == 0, 99, r5 ) );
)
