要件を満たす指定された範囲のデータの最初の位置を効率的に見つける方法は?たとえば、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],
.
)
);
Big Class の完全な例:
もっと見る...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 、
これがあなたの式よりも優れているかどうかはわかりませんが、同じことを行う別の方法があります(私は思います)。これは、大きなテーブルでは遅くなることに注意してください。多くの行 I を扱っている場合は、高さのすべての可能な値に対応する目的の行番号を持つルックアップ テーブルを作成し、それをテーブルに結合できます。

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 ) );
)
