式の作成: グループ列 C で列 B が最小である行の列 A の平均?Big Class データセットを使用していて、同じ年齢の最も身長が低い生徒の平均体重を表す新しい列を作成したいとします。どのように設定すればよいでしょうか?
私は最初の部分 (同じ年齢で最も身長が低い生徒の身長を求める) を行う方法を知っています。これは byVariable を使用した単純な Col Mean です。
列の最小値( :身長, :年齢 )
しかし、どうすればよいのかわかりませんが、(A) その生徒の年齢がこの行の生徒の年齢と一致し、(B) その生徒の身長が一致する場合に、生徒のサブセットの平均体重を計算することです。同年齢の生徒の最も低い身長と一致します。
データのブレンディングとクリーンアップRe: 式を作成します: グループ列 C で列 B が最小である行の列 A の平均ですか?素晴らしい、ありがとう! 毎日 2 つの新しいことを学びます:)
Cars の数式を 1 つの列に結合するには、次のようになります。
:Size[Col Max( If( :Wt == Col Max( :Wt, :Make ), Row(), . ), :Make )]
Re: 式を作成します: グループ列 C で列 B が最小である行の列 A の平均ですか?少し異なる数式を使用してデータ テーブルを添付し、複数に分割しました (以前の Cars のものでは、最大値以外のウェイトのグループ化により問題が発生した可能性があります)。 これにより、同点がある場合に何が起こるかを確認することもできます。
:Size[idx] を使用すると、指定した idx で :Size 列の値にアクセスできます。たとえば、:Size[[1,2,3]] を使用して複数にアクセスすることもできます (これは少し役立つかもしれません)データテーブルの添字付け)
これをスクリプト ウィンドウで実行し、ログを確認してデータテーブルと比較します。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Show(dt:name[1]);
Show(dt:name[5]);
Show(dt:name[10]);
Show(dt:name[[10, 11]]);
Show(dt:name[10::15]);Re: 式を作成します: グループ列 C で列 B が最小である行の列 A の平均ですか?ありがとう@jthi 、それは見事に機能します!
理解していることを確認するために、If ステートメントは、高さがその年齢の最小身長ではない行を無効にする「仮想」列を作成し、Col Mean を使用してその「仮想」列を操作しているようです。 素敵なトリック!
車の例の数式が機能しているようには思えません。たとえば、この数式は、最も重いシボレー (サバーバン) が「mpv」であるにもかかわらず、シボレーの場合は「pu」を返し、クライスラーの場合は「中」を返します。最も重いクライスラー (5 番街) は「hev」です。 とにかく、私のアプリケーションでは、Big Class からの式で問題はすでに解決されています。しかし、単なる好奇心から、そして私の JMP の取り組みをさらに進めるために、最終的な式で何が起こっているのかをもっと知りたいと思っています。 括弧演算子、たとえば「:Size[...]」は何をしますか?
Re: 式を作成します: グループ列 C で列 B が最小である行の列 A の平均ですか?これは、次の式で行うことができます (年齢グループの最小体重の平均を取得します)。
Col Mean(If(:height == Col Min(:height, :age), :weight, .), :age)
もう少しわかりやすくするために、式を 2 つの異なる式に分割します。
最小重量値:
If(:height == Col Min(:height, :age),
:weight,
.
)
そしてその値の平均:
Col Mean(:MinWeightVal, :age)
Col Mean は欠損値を無視するため、これは機能するはずです
車の場合 (データをどのように表示したいか正確にはわかりません:
メーカーの最大重量:
Col Max(:Wt, :Make)
1 行のみにしたい場合の重みのサイズ:
If(:Wt == :Max Wt for Make,:Size,"")
複数の行に同じ値を指定すると、そこからいくつかの Col 関数を削除できる可能性が高くなりますが、これが私がすぐに思いついた最も簡単な方法でした。
:Size[Col Max(Col Max(Row(), If(:Wt == Col Max(:Wt, :Make), 1, 0), :Make), :Make)]
複数の異なる数式に吐き出して、それがどのように機能するかを確認してください
Re: 式を作成します: グループ列 C で列 B が最小である行の列 A の平均ですか?こんにちは@マークシュワブ、
テーブルをソートする余裕がある場合は、これを試してください。
Names default to here (1);
// Open Data Table: Cars.jmp
dt = Open( "$SAMPLE_DATA/Cars.jmp" );
// Sort data table
dt << Sort( By( :Make, :Wt ), Replace Table, Order( Ascending, Descending ) );
// New column: Size of Max Wt for Make<BR />dt << New Column( "Size of Max Wt for Make",<BR />Character,<BR />"Nominal",<BR />Formula( If( Row() == 1, :Size, :Make == Lag( :Make ), Lag( :Size of Max Wt for Make ), :Make != Lag( :Make ), :Size ) )<BR />);<BR />
今では、ソートなしの直接の数式解も知りたいと思っています。
後でデータを再ソートする必要がある場合は、式を削除するか、評価を抑制してください。
Re: 式を作成します: グループ列 C で列 B が最小である行の列 A の平均ですか?ありがとうロン。 私にとってはそれがうまくいくと思います(ただし、同じデータシート内でそれができればいいのですが)。
うまくいけば、それを簡単にするために、実際のアプリケーションでは平均値の代わりに検索を使用しても問題ありません。最大値を取得する列はタイムスタンプであり、グループごとに 1 つの一意の行があると想定できます。最新のタイムスタンプ。
たとえば、Cars データセットを使用すると、問題は次のようになります。
「メーカーの最大重量のサイズ」列を作成し、同じメーカーのすべての車の中で最大重量の車を検索し、その最大重量の車のサイズを検索します。
Re: 式を作成します: グループ列 C で列 B が最小である行の列 A の平均ですか?こんにちは@マークシュワブ、
誰かが列数式を使用する洗練された方法を教えてくれるまで、次のことを試すことができます。
names default to here (1);
// Open Data Table: Big Class.jmp
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// New column: min height 0/1
dt<< New Column( "min height",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( If( :height == Col Min( :height, :age ), 1 ) )
);
// Data table summary
// → Data Table( "Big Class By (age, Min height)" )
dt2 = dt << Summary(
Group( :age, :Min height ),
Mean( :weight ),
Freq( "None" ),
Weight( "None" ),
Link to original data table( 0 )
);
// Delete selected rows
dt2 <<
Select Where( Is Missing( :Min height ) ) << Delete Rows;
// Update data tables
dt << Update(
With( dt2 ),
Match Columns( :age = :age ),
Replace Columns in Main Table(:"Mean(weight)"n )
);
数式は自動的に更新されるため、より便利です。
役に立ったかどうかお知らせください。
ロン