データ フィルターが for ループで停止しましたさまざまな実験条件で収集されたスペクトルの一部で、y 最大ピークの x 値を検索するための for ループ スクリプトを作成しています。ただし、データ フィルターは 1 ラウンド実行した後に、「選択は別のウィンドウで変更されました」という警告が表示されて停止しました。スクリプトをスムーズに実行して for ループを完了するには、この警告を取り除くにはどうすればよいですか。
Big Class.jmp の例を使用して、問題を説明します。目的は、さまざまな年齢 (実験条件と同様) 別に、さまざまな身長範囲 (x 値範囲、たとえば 55 ~ 60、60 ~ 62、62 ~ 65) で最大体重 (y 最大値) を持つ人々に対応するデータのサブセットを表示することです。
x 値の範囲は 2 つのリストにグループ化されています。1 つは下限値、もう 1 つは上限値です。最大値は、データ フィルターを使用した Col Maximum によって検出されます。計算は、リストに沿って複数の x 値の範囲でループされます。ただし、i=1 を実行した後、ループが停止し、データ フィルターの警告が表示されます。スクリプトが for ループを完了できるように、この警告を取り除くにはどうすればよいでしょうか。
Names Default To Here( 1 );
ListA = {55, 60, 62};
ListB = {60, 62, 65};
for(i=1, i<=3, i++,
dt = Data Table( "Big Class" );
Current Data Table (dt);
a = ListA[i];
b = ListB[i];
dt << Data Filter(Add Filter(columns(:height), where(:height > a & :height < b)), Mode( Select( 0 ), Show( 0 ), Include( 1 )), Show Window(0), Auto Clear(1));
dt << select where (col maximum(:weight, :age, Excluded()) == :weight & :height > a & :height < b);
dt << subset(selected rows(1), columns({"name", "age", "sex", "height", "weight"}));
dt << Clear Row States;
dt << Clear Select();
);
自動化とスクリプトRe: データ フィルターが for ループで停止しました下記の簡略化された JSL で、必要な情報が得られると思います。
Names Default To Here( 1 );
dt =
// Open Data Table: semiconductor capability.jmp
// → Data Table( "semiconductor capability" )
Open( "$SAMPLE_DATA/big class.jmp" );
ListA = {55, 60, 62};
ListB = {60, 62, 65};
For( i = 1, i <= 3, i++,
a = ListA[i];
b = ListB[i];
Current Data Table( dt );
theMax = Col Maximum( If( :weight & :height > a & :height < b, :weight, . ) );
dt << select where( theMax == :weight & :height > a & :height < b );
If( N Rows( dt << get selected rows ) > 0,
dt << subset( selected rows( 1 ), columns( {"name", "age", "sex", "height", "weight"} ) )
);
dt << Clear Row States;
Wait( 0 );
);Re: データ フィルターが for ループで停止しましたしかし、このスクリプトには「年齢別」機能がありません。例えば、私のスクリプトでは、i = 2 (ListA = 60、ListB = 62) の場合、結果は次のようになります。
| 名前 | 年 | セックス | 身長 | 重さ |
| ジェームズ | 12 | M | 61 | 128 |
| アリス | 13 | F | 61 | 107 |
| ジュディ | 14 | F | 61 | 81 |
しかし、あなたのスクリプトでは対応する部分が次のように示されています
これは、私のスクリプトの Col Maximum に「年齢別」の部分があるためです。残念ながら、あなたのスクリプトに「年齢別」の部分を追加したとしても、
theMax = Col Maximum( If( :weight & :height > a & :height < b, :weight, . ), :age );
「行番号が無効です」という警告が表示されます
スクリプトはスムーズに実行されます。スクリプトの Col Maximum に「年齢別」の部分を追加するにはどうすればよいでしょうか?
Re: データ フィルターが for ループで停止しましたCol Max のドキュメントをご覧ください。実際に必要な作業はすべて実行できます。
補助列 height_bin を使用するだけです (例: Transform Column 経由)。データ フィルターは必要ありません...

この表によると、ジェームズ、バーバラ、ジュディ、マリオンです。
データ フィルターを使用して height_bins を定義する場合は、接合ポイント (例: height=60) を忘れないようにしてください。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << New Column( "height_bin",
"Character",
Formula(
If(
:height < 60, "<60",
:height <62, "<62",
">=62"
)
) );
New Column( "weight_max",
Formula( Col Maximum( :weight, :age, :height_bin ) )
);
New Column( "is max",nominal,
Formula( :weight == :weight_max ),
);
Graph Builder(
Variables( X( :age ), Y( :weight ), Group Y( :height_bin ) ),
Elements( Bar( X, Y, Label( "Label by Row" ) ) ),
Local Data Filter( Add Filter( columns( :is max ), Where( :is max == 1 ) ) )
);