JSL 専門家の皆さん、こんにちは。
1つの列で2番目の最大値、3番目の最大値などの値を見つけるのに大きな問題があります。
以下の列では、上位 5 つの最大値を特定し、その値を別の列にマーク付けしたいと考えています。
列の最大値だけを見つけることができるようですが、2番目の最大値、3番目の最大値などを見つけるのは非常に困難です。
この解決策の標準的な公式はありますか?
ありがとう
(100、
232、
343、
121、
100、
132、
100、
100、
100、
100、)
古いバージョンのJMPを使用している可能性があります...そのシナリオで示した数式を手動で入力すると機能しますか? これはあなたのために働くかもしれません-変数によるサポートが列関数にいつ追加されたか思い出せません... 多くの人にとってはJMP14だったのではないかと思います。
乾杯、
ブレイディ
どうもありがとう。
ケース1の場合、私のJMPには[分布]の下のランクがないようです。写真に示されているように、最初の6つのオプションしかありません。
数式列>分布>ランク(逆順)。
ケース3は私の現在の問題のより良い解決策のようだと思います、助けに感謝します。
やあ、
これは、「最大」の意味と、テーブルを並べ替える意思があるかどうかによって異なります。 いくつかの一般的なケースについて説明し、そのうちの1つがユースケースをカバーすることを願っています。
ケース1:「最大」は、重複を含む元の値のソートされたデータセット内の位置を意味します。
これには、組み込みの変換を使用できます。 目的の列のデータを右クリックし、[新しい数式列]>[分布]>[ランク(逆順)]を選択します。
作成された数式をクリックすると、次のようになります。これは、テーブルが並べ替えられているかどうかに関係なく機能します。
(Col Number( :Col1 ) - Col Rank( :Col1 )) + 1

ケース2:「最大」は、ソートされたUNIQUE値のセット内の位置を意味します(重複なし)。 データを事前に並べ替えたくない。
***注:連想配列に依存しているため、このアプローチは整数を含む数値データでのみ機能します。
複雑な(そして高価な)式を使用できます。
Loc(
Matrix(
Reverse(
Associative Array( (:Col1 << get data table) :: col1 << getvalues ) << get keys
)
),
:Col1
)
この式は次のことを行います。
1)対象の列から値を取得し、それらを連想配列に渡します。連想配列は重複を削除します。
2)連想配列キーを(デフォルトでは低いものから高いものへの順序で)取得し、それらの順序を逆にします。
3)Loc()関数を使用して、逆連想配列キーのマトリックス内の指定された行の位置を報告します。
ケース3:ケース2と同様ですが、関心のある列で事前に並べ替え(降順)します。
この場合、自己参照式ではありますが、より単純で効率的な式を使用できます。
If( Row() == 1,
1,
Lag( :Formula3 ) + (Lag( :Col1 ) != :Col1)
)
以下に、最初の式と次の2つの式の違いを示します。 繰り返しますが、3番目の式のみがテーブルの並べ替えに依存しています。

これを試してみたい場合は、以下のスクリプトを実行してください。 最初は並べ替えられていないように見えますが、1秒間休止すると、col1で並べ替えられます。その時点で、3番目の数式の結果は2番目の数式の結果と一致します。
dt = New Table( "Example",
Add Rows( 20 ),
New Column( "Col1", <<SET values=""></SET>
乾杯、
ブレイディ