列内の特定の条件を満たす一意のアイテムの数をカウントします例えば、「ビッグクラス」というデータセットで、現在の行の人物の身長以下の人物の固有の名前の数を数える数式を作成したいとします。どうすればそれが可能でしょうか?
私はこれを持っています:
thisHeight = :height;
Col N Unique( :name, :height <= thisHeight );
2番目のパラメータがグループ化パラメータであることは理解していますし、最初のパラメータに渡される値を制限しようとする方が直感的であることも分かっていますが、今のところ試したことはどれもうまくいっていません。
データアクセスRe: 列内の特定の条件を満たす一意のアイテムの数をカウントする最も近い組み込み関数はCol Rank( :height, < 問題は、これはthisHeight以下の行の総数をカウントするものであり、一意の名前の数をカウントするものではないということです。
代わりに、次のようなカスタム数式を試してみてください。
thisHeight = :height; //store the current height value
// Build an associative array to collect unique names at or below thisHeight
aa = Associative Array();
For( i = 1, i <= N Rows(), i++,
If( Column("height")[i] <= thisHeight,
aa[Column("name")[i]] = 1 // This only adds to the Associative Array if this is a new, unique name
)
);
// The number of Items that have been added to the array = number of unique names
N Items( aa )
Re: 列内の特定の条件を満たす一意のアイテムの数をカウントする新しいCol関数は古いものとは少し動作が異なるため、Col関数でそれが可能かどうかはわかりません。
As Constant(n = :name << get values);
curheight = :height;
r = Where(:height <= curheight);
N Items(Set Unique(n[r]));
Re: 列内の特定の条件を満たす一意のアイテムの数をカウントする昨日の晩、これと非常によく似たことを試してみたところ、JMPがフリーズしてしまいました。一晩中実行させたままにしておいたのですが、今朝出社してみるとJMPのデータテーブルウィンドウは真っ白で応答せず、タスクマネージャーを見ると、マシンは1つのコアしか使用しておらず、40GB以上のRAMが空いていました(つまり、RAM不足やCPU占有には至っていません)。私のテーブルには40万行近くあるので、これはおそらくO(N^2)のような処理量になるのではないかと思います。
Re: 列内の特定の条件を満たす一意のアイテムの数をカウントする@jthi上記の私のコメントについてですが、これもO(N^2)の解法のように見えます。(間違った数式でセッション全体がブロック/クラッシュしてしまうのは本当に残念です。昨日、似たような解法を試みたせいで、午後の作業の大部分を失ってしまいました。)
新しいCol関数が以前と同じように動作しないのは残念です。私の質問は単純すぎたかもしれません。グループ化列も必要なのですが、このソリューションでどのように実装すればよいのか分かりません。おそらくPythonで実装するしかないでしょう。列が自動更新されないことと、Pythonスクリプトをテーブルに保存できないことが残念です。
追伸:毎回のやり取りで少しでもあなたから学びたいという私の目標から
-- なぜこのアプローチには「As Constant()」関数が必要なのですか?それがないとどうなりますか?
Re: 列内の特定の条件を満たす一意のアイテムの数をカウントする数式が必要な場合、Pythonがどれほど有効かは分かりません。Constant() 関数は、各行で名前のリストが何度も繰り返されるのを防ぐために存在するからです。
Re: 列内の特定の条件を満たす一意のアイテムの数をカウントするPythonによる解決策はうまくいき、全体的に見て実装・実行もかなり迅速だった。
Col N Unique() 関数が将来のバージョンで他の関数と同様に改良されることを期待しています。
どこかに「JMP 数式クックブック」のようなものがあって、それを活用したり検索したりできたらいいのに、と少し思います。私は成人してからの 33 年間ずっと、VBA、AppleScript、Perl、Python、JavaScript(そして少しだけ C++)を積極的にコーディングしてきましたが、JSL はそれらの中で断トツで一番学習と理解が難しいです。As Constant() がなぜ必要なのか、そもそも何をするのか、いまだに理解できていません。スクリプトガイドはほとんど読みましたが、どうにかして別のガイドブックが必要だと感じています。
Re: 列内の特定の条件を満たす一意のアイテムの数をカウントする数式の実行の各行で値が変わらない場合は、その値を評価する必要はありません。As Constant() 関数はまさにそれを実現するもので、JMP ではその式を最初の行で一度だけ評価します。
定数(式)として

基本的には、(おそらく全く同じではないでしょうが、かなり近い)ものに置き換えることができると思います。
If(Row() == 1,
n = :name << get values;
);
Re: 列内の特定の条件を満たす一意のアイテムの数をカウントするこの質問を深掘りしすぎる恐れはあるものの、もう一つ質問させてください。
列の数式は実質的に一度だけ評価されるが、各式は配列のコンテキストで評価されるのでしょうか?
それとも、Row() 関数によって現在評価中の行が決定され、数式全体が各行ごとに一度再実行されるのでしょうか?
それとも、もっと根本的なことを誤解しているのでしょうか?JMPが数式をどのように扱っているのか、私の頭の中のイメージは互いに矛盾する二つの部分に分かれてしまっています…。
Re: 列内の特定の条件を満たす一意のアイテムの数をカウントするJMPの内部構造に詳しい人なら、私の推測よりも的確な答えを出せるでしょう(おそらく@Craige_Halesさん)。私はそれらを式(単なるJSL)と考えており、必要に応じて各行に対して直接データテーブルに評価されます。評価を抑制しない限り、この「必要」なタイミングはJMPによって決定されます。Col関数など、ほとんどの場合一度だけ評価される最適化機能もいくつかあります。
JMPヘルプには役立つリンクがいくつかありますが、すぐに見つけられたのはこれだけです。
Re: 列内の特定の条件を満たす一意のアイテムの数をカウントするウサギの穴を探検するためのテクニックをご紹介します。
New Table( "Untitled",
Add Rows( 3 ),
New Column( "a",
Formula(Write( "\!nA" || Char( Row() ) );Row();),
Set Selected
),
New Column( "b",
Formula(Write( "\!nB" || Char( Row() ) );:c + :d + 100;)
),
New Column( "c",
Formula(Write( "\!nC" || Char( Row() ) );:a + 1000;)
),
New Column( "d",
Formula(Write( "\!nD" || Char( Row() ) );:a + 10000;)
),
new column( "e",
formula(write("\!nE" || char(row())); asconstant(write("\!nE as constant "|| char(row())); Q=a+b+c+d); Q;)
)
);
/*
A1 << A must be done first, every other column depends on A
A2
A3
D1
D2
D3
C1
C2
C3
B1 << B must be after C and D
B2
B3
E as constant 1 << the constant is calculated before the first cell, but using row 1
E1 << E must be last; the asconstant value uses all other columns
E2
E3
*/

セミコロン(;)は、一連のステートメントを実行し、最後のステートメントの値を返すJSL演算子です。つまり、print/show/writeステートメントを計算式の前に追加することで、ログにトレースを作成できます。
上記で、asconstant(...) は最初の行が計算される前に引き出されますが、行 1 が現在の行になります。
JMPはまた、列をソートして、どの列を最初に評価できるかを判断します。
Re: 列内の特定の条件を満たす一意のアイテムの数をカウントするE列は次のようにした方がより理にかなっているでしょう。
New Column( "e",
formula(
Write( "\!nE" || Char( Row() ) );
As Constant( Write( "\!nE as constant " || Char( Row() ) ); a + b + c + d; );
)
)
Q変数は不要であり、AsColumnの役割を隠蔽してしまう。
Re: 列内の特定の条件を満たす一意のアイテムの数をカウントするもう一つ役立つリンクがあります(すべてを単一の数式に無理やり押し込まないでください) 。JMP の使用 > JMP で数式を作成 > JMP で数式を作成

さらに、複数の数式がある場合、結果の検証がはるかに容易になり、場合によっては数式のデバッグも容易になります。