複数の列にわたる各行の最大値と、対応するソース列の名前こんにちは。各行の最大値とその最大値に対応する列名 (またはパラメーター) を見つける簡単な方法はありますか? 以下はリクエストを説明する簡単な例です。
| T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9 | T10 | 最大値 | Col_Name (パラメータ) |
| 87.2 | 83.6 | 81.4 | 83 | 83 | 83 | 83 | 82.3 | 83.3 | 84.6 | 87.2 | T1 |
| 85.9 | 84 | 82 | 84 | 83.3 | 83.3 | 84 | 83 | 86.5 | 87.2 | 87.2 | T10 |
| 84.9 | 82.7 | 86 | 83 | 82.3 | 82.3 | 83 | 82 | 83.6 | 85.2 | 86 | T3 |
| 85.6 | 84.6 | 82.7 | 84.6 | 84.3 | 84.3 | 84.3 | 83.6 | 84.9 | 86.2 | 86.2 | T10 |
| 85.2 | 83.6 | 82 | 83.3 | 83 | 83 | 83.3 | 82.3 | 84.3 | 85.6 | 85.6 | T10 |
| 86.8 | 84.3 | 82.7 | 84.3 | 83.6 | 83.6 | 84.3 | 83.3 | 85.9 | 86.2 | 86.8 | T1 |
| 86.2 | 84 | 82.3 | 84 | 87 | 83.3 | 83.6 | 83 | 84.9 | 85.9 | 87 | T5 |
| 88.1 | 84.6 | 82.3 | 84.3 | 83.6 | 84 | 84.3 | 83.3 | 85.9 | 86.2 | 88.1 | T1 |
| 85.6 | 83.3 | 81.7 | 83.3 | 83 | 83 | 83.6 | 82.7 | 84 | 85.9 | 85.9 | T10 |
| 37.4 | 36.1 | 36.4 | 36.4 | 36.1 | 36.1 | 36.4 | 35.4 | 36.7 | 37.4 | 37.4 | T1 |
| 36.7 | 34.5 | 34.8 | 34.5 | 33.8 | 34.1 | 34.5 | 33.5 | 36.1 | 36.1 | 36.7 | T1 |
| 34.8 | 32.9 | 33.2 | 32.9 | 32.2 | 32.5 | 36 | 31.9 | 33.8 | 35.1 | 36 | T7 |
| 38 | 36.4 | 36.4 | 36.4 | 36.4 | 36.1 | 36.7 | 39 | 38 | 38.3 | 39 | T8 |
| 38 | 35.1 | 35.1 | 40 | 34.1 | 34.5 | 34.8 | 33.8 | 36.4 | 37 | 40 | T4 |
ありがとう!
Re: 複数の列にわたる各行の最大値と、対応するソース列の名前最初にあなたの質問を読み間違えました...そのため、この回答には、substituteIntoを使用しない単純化と、特定の値を探すバリエーションが含まれています。
dt = New Table( "Untitled",
Add Rows( 3 ),
New Column( "first", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 5, 9] ) ),
New Column( "second", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [2, 6, 10] ) ),
New Column( "skip", character, setvalues( {"a", "b", "c"} ) ),
New Column( "third", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [3, 7, 11] ) ),
New Column( "fourth", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 8, 12] ) )
);
names = dt << getcolumnnames( "numeric" ); // returns a list of all numeric column names
findval=7;
row = 2;
Row() = row; // names will pull data from the current row
rowpos = Loc( findval==matrix(evallist(names)) );
show(names[rowpos],names[rowpos[1]][row]);
names[rowpos] = {:third};
names[rowpos[1]][2] = 7;
Loc は、行列内のゼロ以外の項目の位置を返します。 スカラーと行列を使用した == 演算子は、1 と 0 の行列を返します。 Loc 関数は、行位置 (1 のインデックスを持つ) の行列を返します。 [1] は、findval に一致した最初の位置を取得します。 names[rowpos[1]] は列名であり、[row] は列の行から一致する答えを取得します。
Re: 複数の列にわたる各行の最大値と、対応するソース列の名前ありがとうクレイジ!
Concat() の代わりに、Substitute Into() とともに使用して、複数の列にわたる行内の特定の値の位置を見つけることができる他の関数はありますか?
dt = New Table( "Untitled",
Add Rows( 3 ),
New Column( "first", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 5, 9] ) ),
New Column( "second", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [2, 6, 10] ) ),
New Column( "skip", character, setvalues( {"a", "b", "c"} ) ),
New Column( "third", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [3, 7, 11] ) ),
New Column( "fourth", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 8, 12] ) )
);
names = dt << getcolumnnames( "numeric" ); // returns a list of all numeric column names
Show( names ); // {first, second, third, fourth}
Substitute Into( names, Expr( {} ), Expr( Concat() ) );
Show( Name Expr( names ) ); // first || second || third || fourth
Row() = 2; // names will pull data from the current row
rowpos = Loc( names, 6 ); // works only with a list
ありがとう、
ラヴィ
Re: 複数の列にわたる各行の最大値と、対応するソース列の名前(IFMax を調べてみます...) はい、列を簡単にリストできれば、説明がずっと簡単になります。 おそらく速度も速くなります。 ご指摘いただきありがとうございます!
Re: 複数の列にわたる各行の最大値と、対応するソース列の名前新しい列で IFMax 関数を使用すると何か問題がありますか?列の数が多い場合、これは面倒なことだと思いますが、列が 20 個以下の場合は、IFMax の式を入力するだけで非常に簡単です。
Re: 複数の列にわたる各行の最大値と、対応するソース列の名前データテーブルの添字は、JMP 13 の新機能です。
このアイデアのようなものを試して、評価時に現在の行から行ベクトル行列を作成する式を構築できます。
dt = New Table( "Untitled",
Add Rows( 3 ),
New Column( "first", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 5, 9] ) ),
New Column( "second", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [2, 6, 10] ) ),
New Column( "skip", character, setvalues( {"a", "b", "c"} ) ),
New Column( "third", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [3, 7, 11] ) ),
New Column( "fourth", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 8, 12] ) )
);
names = dt << getcolumnnames( "numeric" ); // returns a list of all numeric column names
Show( names ); // {first, second, third, fourth}
Substitute Into( names, Expr( {} ), Expr( Concat() ) );
Show( Name Expr( names ) ); // first || second || third || fourth
Row() = 2; // names will pull data from the current row
rowvec = (Eval( names )); // [5 6 7 8]
行名のリストを指定すると、Substitute Into() 関数は中括弧リスト演算子を concat 関数に置き換えます。 Concat 関数は || と同じです。連結演算子であり、多くの引数を取ることができます。 連結では、現在の行のリスト内の各列参照が評価されます。 個々のスカラー値は行行列に連結されます。
Re: 複数の列にわたる各行の最大値と、対応するソース列の名前こんにちは、クレイジさん
JMP 10 でサンプル スクリプトを実行すると、「引数は 'Loc Max' のアクセスまたは評価で行列{1}である必要があります。引数が正しくありません...」というエラー メッセージが表示されます。
JMP10 ではデータテーブルのインデックス作成は許可されていませんか?
ありがとう!
Re: 複数の列にわたる各行の最大値と、対応するソース列の名前OK、何かが足りない....私の出力を添付します。 結果を確認すると、列 MaxVal にはその行の列 3 ~ 25 で見つかった最大値が含まれており、MaxVal_Col は最大値が見つかった列の名前です。
私には何が欠けているのでしょうか?
Re: 複数の列にわたる各行の最大値と、対応するソース列の名前改めてジムに感謝します! ただし、出力を調べてみると、それが正しくないことがわかると思います。
Re: 複数の列にわたる各行の最大値と、対応するソース列の名前OK...私の間違いです。無効な結果が得られたということではなく、コードを実行できなかったのではないかと考えていました。 問題は、列のリスト「colnames」が、Loc Max を実行している列のリストと一致しないことです。 最初と 2 番目の列名を「colnames」リストから削除する必要があります。 この問題により、次のステートメントを使用して MaxVal を取得する際にも問題が発生しました。
MaxVal = dt[r, 場所];
これは、データ テーブル全体を調べており、返される位置は、データ テーブルより 2 列少ない行列に基づいているためです。
そこで、この問題を克服する方法の 1 つを示す簡単な書き直しを行いました。
dt = Open( "C:/data.jmp" );
colnames = dt << getcolumnnames;
For( i = 2, i >= 0, i--,
colnames = Remove( colnames, i, 1 )
);
For Each Row(
r = Row();
location = Loc Max( dt[r, 3 :: 25] ); // location of maximum value in array from Col #3 to #25
//MaxVal = dt[r, location];
MaxVal_Col = colnames[location] << getname;
MaxVal = as column(eval(MaxVal_Col));
);
Re: 複数の列にわたる各行の最大値と、対応するソース列の名前ありがとうジム! これは私が得たものですが、出力は正しくありません(たとえば、行 #1 と #2)。
Re: 複数の列にわたる各行の最大値と、対応するソース列の名前ありがとうジム! これは私が得たものですが、出力は正しくありません(たとえば、行 #1 と #2)。
Re: 複数の列にわたる各行の最大値と、対応するソース列の名前キャッシュが原因と思われるエラーがいくつか発生しました。 これらを回避する唯一の方法は、JMP 自体ではなく OS を再起動することです。
OSを再起動した後、更新されたスクリプトを実行して確認していただけますか?
Re: 複数の列にわたる各行の最大値と、対応するソース列の名前スクリプトを実行した後のデータテーブルは次のとおりです
Re: 複数の列にわたる各行の最大値と、対応するソース列の名前ジムさん、返信ありがとうございます! ただし、それはまだ私にとってはうまくいきませんdt=現在のデータテーブル()。 何が起こっているのかわかりません。 ところで、生成した出力ファイルを送ってもらえますか?
ありがとう!
Re: 複数の列にわたる各行の最大値と、対応するソース列の名前スクリプトとデータテーブルは私にとってはうまくいきました。さて、私は変更しました
dt=Open("........");
に
dt=current data table();
テーブルはすでに開いていたので。
したがって、それを試すか、dt=Open ステートメントの後に追加のステートメントを配置することをお勧めします。
wait(0);
For Each Row が開始される前にデータ テーブルが完了していない可能性があります。待機(0); For Each Row を実行する前にオープンを強制的に完了させます。
Re: 複数の列にわたる各行の最大値と、対応するソース列の名前私にとってはまだ適切に機能しません。 スクリプトとデータ ファイルの両方を添付してください。 ここで私が何を間違えたのか教えていただけますか?
ありがとう!
Re: 複数の列にわたる各行の最大値と、対応するソース列の名前いい視点ね。 この例は次のように一般化できます (意図的に見苦しい列の配置になっています...) どちらかまたは両方から最適なものを選択してください。 2 番目の方法には、列が誤って再配置されるのを防ぐという利点があります。 最初の方法は、数百の列に適している可能性があります。
dt = New Table( "Untitled",
New Column( "maxval", numeric ),
New Column( "a", Numeric, Set Values( [1, 33, 1] ) ),
New Column( "maxcol", Numeric ),
New Column( "b", Numeric, Set Values( [2, 2, 2] ) ),
New Column( "c", Numeric, Set Values( [333, 1, 0] ) ),
);
// either
vars = [2 4 5];
colnames = (dt << getcolumnnames)[vars];
// or
colnames={a,b,c}; // this might be best choice
For Each Row(
row = Row();
location = Loc Max( dt[ row, colnames] ); // location of maximum value in array
col = colnames[location]<<GETNAME></GETNAME>Re: 複数の列にわたる各行の最大値と、対応するソース列の名前位置変数に追加する必要がある列のオフセットが欠落していたことが解決されました。
Re: 複数の列にわたる各行の最大値と、対応するソース列の名前ここで 1 つの問題に遭遇しました。選択する必要がある列がデータセットの間にある場合、機能しないように見えます。
For Each Row(
r = Row();
// 1::3 means columns 1 through 3. {a,b,c} would also work.
location = Loc Max( dt[ r, 57 :: 113] ); // location of maximum value in array
maxval = dt[r, location];
maxcol = colnames[location] << getname;
);
列 57 から 113 を選択する必要がありますが、何らかの理由でスクリプトを使用してこれを実行すると、間違った値が取得されます。
Re: 複数の列にわたる各行の最大値と、対応するソース列の名前// this example uses JMP 13 data table indexing
dt = New Table( "Untitled",
New Column( "a", Numeric, Set Values( [1, 33, 1] ) ),
New Column( "b", Numeric, Set Values( [2, 2, 2] ) ),
New Column( "c", Numeric, Set Values( [333, 1, 0] ) ),
New Column( "maxval", numeric ),
New Column( "maxcol", Numeric )
);
colnames = dt << getcolumnnames;
For Each Row(
r = Row();
// 1::3 means columns 1 through 3. {a,b,c} would also work.
location = Loc Max( dt[ r, 1 :: 3] ); // location of maximum value in array
maxval = dt[r, location];
maxcol = colnames[location] << getname;
);
Data table with maximum value from row and name of maximum column for rowData table with maximum value from row and name of maximum column for row行の最大値と行の最大列の名前を含むデータ テーブル
データテーブルのサブスクリプションに関する以前の投稿
Re: 複数の列にわたる各行の最大値と、対応するソース列の名前まったく同じソリューションを探しています。
各行の最大値を見つけて列名を返すので、結果のデータに対して統計を実行できます。
たとえば、列名が最大値として表示される回数、最大値に寄与する列の数、STD DEV などを確認します。