データグループ全体で最小値と最大値を特定する方法ビッグクラスの生徒全員を性別と年齢別にグループ分けするとします。たとえば、12 歳の男子を 1 つのグループに、12 歳の女子を別のグループに、などです。
この設定で、そのグループの男女の年齢に対する最大身長が最も低い場合は 1、そうでない場合は 0 になる数式列を作成したいと思います。
たとえば、このデータでは次のようになります。
| グループ | 名前 | 身長 | 新しいコラム |
| 12歳の女の子 | ケイティ | 59 | 0 |
| | ジェーン | 55 | 0 |
| | ジャクリン | 66 | 0 |
| | リリー | 52 | 0 |
| 12歳男子 | ティム | 60 | 1 |
| | ジェームズ | 61 | 1 |
| | ロバート | 51 | 1 |
女子の最大身長は 66 で、男子は 61 なので、男子グループは年齢に対して最大身長が最も低いため、新しい数式列では、Tim、James、Robert には 1 が、Katie、Louise、Jane などには 0 が入ります。
数式列でこれは可能ですか?
(私が試したことは共有できますが、xyproblem ( http://xyproblem.info ) は避けようとしています...)
基本的なデータ分析とモデリングデータの探索と視覚化Re: データ グループ全体で最小値と最大値を識別する方法Col ... 集計を使用できます。
編集: 年齢層ごとに身長が最も低い生徒の性別を尋ねられた場合:
まず、Col Min を使用して、年齢ごとに身長が最小の生徒を見つけます。
次に、Col Max を使用して、この知識を同じ性別のすべての学生に広めます。
それで:
New Column( "myCol",
Formula( Col Maximum( :height == Col Minimum( :height, :age ), :sex, :age ) ),
)
ご要望通り
男女ともにその年齢層で身長が最も低いグループには 1が入り、そうでない場合は 0 が入る数式列
アプローチを修正する必要がある
New Column( "myCol",
Formula(
Col Maximum(
:height == Col Min( Col Maximum( :height, :age, :sex ), :age ),
:sex,
:age
)
)
)
次のような考えに沿って:
- 年齢と性別ごとの最大身長はいくらですか
- 値を取得して、年齢ごとの最小(最大)身長を見つけます
- which student?
[あ、いいえ、ランダムな生徒ではなく、最大身長の生徒が欲しいだけです!]
-> replace :height with Col Maximum( :height, :age, :sex ) *) </CODE>use col max to spread the 1 to all other students with the same sex and age</STRIKE><BR /><STRIKE>同じ身長の男の子と女の子がいる場合は、もう一方の性別を 0 または 1 に設定します。</STRIKE><BR /><FONT face="comic sans ms,sans-serif" color="#999999">この部分はもう必要ありません</FONT><BR /><FONT face="comic sans ms,sans-serif" color="#999999">...そして私たちはまさにJarmoの解決策にたどり着きました(下記参照)</FONT><BR /><BR /></LI></UL></LINGO-BODY><LINGO-SUB id="lingo-sub-821774" slang="en-US" mode="CREATE">Re: データ グループ全体で最小値と最大値を識別する方法</LINGO-SUB><LINGO-BODY id="lingo-body-821774" slang="en-US" mode="CREATE"><P>XY問題:<BR />ありがとう : )</P></LINGO-BODY><LINGO-SUB id="lingo-sub-821776" slang="en-US" mode="CREATE">Re: データ グループ全体で最小値と最大値を識別する方法</LINGO-SUB><LINGO-BODY id="lingo-body-821776" slang="en-US" mode="CREATE"><P>わあ、それはうまくいくようですが、私の脳ではこれがどのように機能するか理解できません...</P><P> </P><P>ここでそれを解き明かしてみます。皆さんも理解するのを手伝っていただけるかもしれません。</P><P> </P><P>開始: Col Maximum( :height == Col Minimum( :height, :age ), :sex, :age )</P><P> </P><P>Col Minimum( :height, :age ) --> この年齢のすべての生徒の最小身長を返します</P><P> </P><P>:height == Col Minimum( :height, :age ) --> この行の高さの列が最小の高さと一致する場合は true/false (1/0) を返します。</P><P> </P><P>Col Maximum( <この行の 1 または 0> 、:sex、:age) --> うーん...これは意味がありません。列の最大値は、グループ化列 (:sex、:age) でデータをグループ化し、最初の引数の値または列の列の最大値 (これは単一の true/false または 1/0 になります) を見つけて、この行のグループの対応する最大値 (つまり、この行の :sex と :age の値) を返すものだと思っていました。</P><P> </P><P>明らかにそれは間違っています。ここで何が欠けているのでしょうか?</P><P> </P><P> </P><P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-821779" slang="en-US" mode="CREATE">Re: データ グループ全体で最小値と最大値を識別する方法</LINGO-SUB><LINGO-BODY id="lingo-body-821779" slang="en-US" mode="CREATE"><P>これを行うには、たとえば、col 統計関数のさまざまな組み合わせ (すでに示したように) を使用する方法がたくさんあります。ここに別のオプションがあります (探している機能を実行するはずです)</P>
<P> </P>
<PRE><CODE class=" language-jsl">Col Min(Col Max(:height, :age, :sex), :age) == Col Max(:height, :age, :sex)
まず、Col Min() は、年齢、性別グループ全体にわたって年齢を超える Col Max() を検索し、それを年齢、性別グループの最大値と比較します。それが年齢グループの最小値と同じである場合、値は 1 になります。
これらを理解しやすくするために、すべてを別々に書き出して理解しやすくするとよいと思います。この場合は次のようになります。
First column with Col Max(:height, :age, :sex) (max_height_for_agesex)
- Next column then utilizes that
Col Min(:max_height_for_agesex, :age) age_minmax_age
- And the final one is the comparison of these two
:max_height_for_agesex == :age_minmax_age
Re: データ グループ全体で最小値と最大値を識別する方法@jthi さん、ありがとうございます。まだ混乱しています。
まず、次のようになります。
Col Min(Col Max(:height, :age, :sex), :age) == Col Max(:height, :age, :sex)
JMP が「Col Max(:height, :age, :sex)」を評価すると、何が返されますか? 単一の値ですか? それともリストですか?
これを数式として新しい列を作成すると、列の行に表示される値のリストが生成されます。
しかし、数式内では、単一の値を返すようです。例:
a = col max(:height, :name);
type(a);
...「Number」を返します。
そして、新しいスクリプトを作成して次のように入力します。
a = col max(:height, :name); <BR />show(a);
「無効な行番号」と表示されますが、「, :name」がなければ 70 を返して正常に動作します。JMP はこれらの関数で何らかのコンテキスト固有の意味を実行しているようです。これはどのように動作するのでしょうか? どこかで説明されていますか?
Re: データ グループ全体で最小値と最大値を識別する方法セル内の数式列の数式を実行すると、現在の行の値が計算されます。
JSL で実行すると、現在の行に対して計算されます。
同じように聞こえます。ただし、「現在の行」のデフォルト値は「行 0」です。つまり、有効な数字はありません。
デフォルトの「0」とは異なる任意の行の計算を確認することもできます。
計算の前にrow()=xy を置くだけで、行xyに対して計算が実行されます。
例えば
row()=5;
col max(:height, :age)
66 を返します。
行 = 5の:ageは12で、 age = 12の最大の高さは66です。
Re: データ グループ全体で最小値と最大値を識別する方法次のように動作すると思います:
Col ... はまずすべての行を実行し、最初の引数の結果を格納します。
行ごとに計算します。たとえば、最初の引数がrandomuniform()の場合などです。
さらに、追加のグループ化引数の参照テーブルを保存します。
次に、データをサブセットに分割し、集計値を計算し、集計値をそれぞれの行に戻します。
Re: データ グループ全体で最小値と最大値を識別する方法
JMP が「Col Max(:height, :age, :sex)」を評価すると、何が返されますか? 単一の値ですか? それともリストですか?
単一の値。
スクリプトを作成して、何が起こっているかをテストしたい場合は、列で使用している場合、Row() を使用する必要があります (列でなくても、JMP はすべての行を使用することを認識しているため機能します)。Row() は JMP ではデフォルトで 0 になるため、たとえば Row() = 1 に変更する必要があります。JMP ヘルプまたはスクリプト インデックスでこれに関するドキュメントを見たことがあると思いますが、どこにあるかはわかりません (Row()、For Each Row、または Col 統計関数に関連している可能性があります)。
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
max_height = Col Max(:height); // works fine as no by var used and uses all rows
Show(Row());
Col Max(:height, :age); // won't work as JMP doesn't know which age to use -> it needs row information
Row() = 1;
cur_age = :age;
cur_maxheight = Col Max(:height, :age);
Write("\!Max height for age ", cur_age, " is ", cur_maxheight);Re: データ グループ全体で最小値と最大値を識別する方法JMP は、列の式全体をループでラップし、テーブルの行に対して「Row()」を反復して各行の値を計算している、と言っているようですね。
次の表現を除けば、それは意味を成すでしょう:
Col Min(Col Max(:height, :age, :sex), :age)
...そのロジックでは、たとえば Row() が i=1 に設定されている場合、Col Max() は、:age[i] == :age[1] かつ :sex[i] == :sex[1] であるテーブル全体の :height 列の最大値として計算され、単一の数値が返されます。次に、その単一の数値の Col Min() を計算しようとしますが、定義上、その数値しか返せません。私は、それが意味をなすようにするのに本当に苦労しています。
Col Max() はリストを返すはずなので、Col Min() は :age[i] == :age[1] となるリストのすべての行を参照している可能性があると考え続けています。
しかし、ここでの私のアイデアでは、JMP が Perl と同様の処理を実行する必要があります。つまり、基本的に何かがスカラー コンテキストで呼び出されたか、リスト コンテキストで呼び出されたかを追跡します。つまり、関数がリストが返されることを期待する方法で使用される場合はリストを返し、そうでない場合はスカラーを返します。そのようにすると、Col Max() は Col Min() のリストを返すことができ、Col Min() はスカラー値を返します。
何か見落としているような気がしますが、それが何なのかはわかりません。
Re: データ グループ全体で最小値と最大値を識別する方法いいえ、JMP はテーブルを 1 行ずつ 1 回ずつ処理して式全体を計算するということではありません。
Re: データ グループ全体で最小値と最大値を識別する方法JMP が何をしているかを調べるために、まずは非常に小さなデータ テーブルを作成しましょう...
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt = dt0 << Clear Select << Select Rows( [2, 10, 11, 25] ) << Subset( Selected Rows( 1 ), Selected columns only( 0 ) );
nr = n rows(current data table());
...そして、ログ機能を備えた数式列:
New Column( "test", Formula(Col Min(Write( "\!nmin:" || (Char( Row() )) );if(row()==nr, write("\!n") );:height, :age)));出力:

したがって、この場合、JMP はコードを複数回実行します。
それは後で考えてみましょう...
Re: データ グループ全体で最小値と最大値を識別する方法それでは確認してみましょう
New Column( "test",
Formula(
Col Min(
Write( "\!nmin:" || (Char( Row() ) || "\!n\!n") );
Col Max(
Write( "max:" || (Char( Row() ) || "\!n") );
:height;,
:age,
:sex
);,
:age
)
)
)
...そして*)が得られます。

これは次のことを示しています:
- 簡単な例では、JMPは各行のCol Minの最初の引数を評価します。
- 2番目のバージョンでは、JMPは各行のCol Minの最初の引数を評価します。このコード内に別のCol...集計があるため、 ColMaxループが続きます。各行のCol Maxの最初の引数
最後に、JMP は各行のColMax(...)の値を認識し、これらの値を使用してCol minを評価できます。
これは、リスト コンテキストで、おっしゃるとおりです。ただし、JMP は結果をデータ テーブル コンテキストに保存すると思います。そのため、VALUES をrow()、row states() などの追加情報と組み合わせることができます。
しかし、JMP の誰か、または@jthiの方がもっとわかりやすく説明してくれるかもしれません...
*) もう一度: 複数回:
詳細は以下をご覧ください:
https://community.jmp.com/t5/Discussions/Statistical-functions-Col-Mean-for-example-possibly-bugged-on/mp/613887/highlight/true#M81398
Re: データ グループ全体で最小値と最大値を識別する方法コードの実行をテストする別の方法:
i = 0;
j = 0;
New Column( "test",
Formula(
Col Min(
i++;
Col Max(
j++;
:height;,
:age,
:sex
);,
:age
)
)
);
// too early
Show( i );
Show( j );
Current Data Table() << run formulas();
// after calculating the values
Show( i );
Show( j );

私 = 5 × 4
5×5×4 (イ)
Re: データ グループ全体で最小値と最大値を識別する方法-
Re: データ グループ全体で最小値と最大値を識別する方法Col 統計関数には、他の関数にはない独自の機能があります。たとえば、内部キャッシュがあり、byvars をサポートしています。https
/www.jmp.com/support/help/en/18.0/#page/jmp/statistical-functions.shtml#
Re: データ グループ全体で最小値と最大値を識別する方法はい、データを準備するこの賢い方法は非常に役立ちます:
魔法がどのように機能するかの例:
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << Clear Select << Select Rows( Index( 5, 40 ) ) <<DELETE rows=""></DELETE>newCol << Set Formula(Col Min(Print(row());:height,:age)); // 2 x 4<BR /><BR />newCol << Set each value(Col Min(Col Max(Print(row());:height,:sex),:age)); // 4 + 4
newCol << Set Formula(Col Min(Col Max(Print(row());:height,:sex),:age)); // 2 x 4 + 4
以下の蛇口にぶつからないように注意してください:
i=1;<BR />newCol << set each value (Col Min(Print("X");:height,:age)); // 16 = 4 x 4
newCol << set Formula (Col Min(Print("X");:height,:age)); // 20 = 5 x 4<BR />newCol << set Formula (Col Min("x";Print(3);:height,:age)); // 20 = 5 x 4
newCol << Set Formula(Col Min(i;Print(row());:height,:age)); // 20 = 5 x 4<BR />
newCol << set each value (Col Min(Col Max(Print("X");:height,:sex),:age)); // 80 = 5 x 4 x 4
newCol << set Formula (Col Min(Col Max(Print("X");:height,:sex),:age)); // 100 = 5 x 5 x 4<BR />newCol << set Formula (Col Min(Col Max("X";Print(3);:height,:sex),:age)); // 100 = 5 x 5 x 4
newCol << Set Formula(Col Min(Col Max(i;Print(row());:height,:sex),:age)); // 100 = 5 x 5 x 4
コル集合体は、
次に、速度を落として、階層ツリー内の各行 (+1) のすべての値を計算します。
Re: データ グループ全体で最小値と最大値を識別する方法あなたがここでやっていることをすべて理解できるほど私が賢いかどうかはわかりませんが --
あなたは私に同意しているようですね?つまり、Col ... 関数はスカラー コンテキストとリスト コンテキストで異なる動作をするということですか?
Re: データ グループ全体で最小値と最大値を識別する方法1年待って再度話し合いましょう。状況が変わる可能性があります。