行列値の置換こんにちは! すべての列データを 8 × 12 の行列に順番に入力しようとしています (最初に下向きに列を入力します)。 列には 72 個の値しかないため、入力されていない残りの値を 0 にしたいと考えています。以下のコードを機能させるのに多くの問題が発生しています。 助けていただければ幸いです。
dt = Open("Example.jmp");<BR />Rows = nrows(dt);
names= dt << Get Column Names (String);
Table =[];
Table = J(8,12,0);
For(i=1, i <= ncol(dt),i++,
data = column(dt, names[i]) <<GETVALUES></GETVALUES>Re: 行列値の置換ありがとう!これは完璧に機能しますRe: 行列値の置換あなたの例がないので、JMP サンプル データ テーブルの 1 つを使用する必要がありました。 初期データ テーブルのこれらの行を独自の行に置き換えます。
Names Default to Here( 1 );
// use sample data to illustrate
dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
// delete non-numeric data columns
dt << Delete Columns( { :Name, :Sex } );
// make empty container
table = Associative Array();
// get each data column and create (key, value) pair (key = col name, value = 8x12 matrix)
For( c = 1, c <= N Col( dt ), c++,
data = Column( dt, c ) << Get As Matrix;
If( N Row( data ) < 96,
data |/= J( 96 - N Row( data ), 1, 0 );
);
table[Column( dt, c ) << Get Name] = Transpose( Shape( data, 12, 8 ) );
);
Close( dt, No Save );
dir = Get Default Directory();
content = table << Get Contents;
For( t = 1, t <= N Items( content ), t++,
dt = As Table( content[t][2] );
file path = dir || content[t][1] || ".CSV";
dt << Save( file path );
Close( dt, No Save );
text = Load Text File( file path );
eol = Contains( text, "\!n" );
text = Munger( text, 1, eol - 1, content[t][1] );
Save Text File( file path, text );
);Re: 行列値の置換手伝ってくれてどうもありがとう。 それは有り難いです。 コードを使用してファイルを保存できましたが、現時点では CSV ファイルの最初の行がデータの最初の行であり、列名がありません。 最初のセルに列の名前を入れ、そのすぐ下に 8 x 12 のデータを入れたいと考えています。Re: 行列値の置換しばらくお待ちください。 何らかの理由で CSV ファイルを保存できません。 私はテクニカルサポートと協力しています。
彼らの返答を待つ間、CSV ファイルの最初の行 (元のデータ列ヘッダー) を元のデータ列名のみに置き換えるかどうかを確認したいと思います。
Re: 行列値の置換これはうまくいきました!! ただし、実際には、csv ファイルの最初の行として列名 (この場合は content[t][1]) を保持したいと考えていました。 現在は表示されません。 CSV ファイルの最初のセルにそれを保持する方法を知っていますか?Re: 行列値の置換OK、この更新されたバージョンのスクリプトはうまくいくはずです。
Names Default to Here( 1 );
dt = Open( "Example.jmp" );
table = Associative Array();
For( c = 1, c <= N Col( dt ), c++,
data = Column( dt, c ) << Get As Matrix;
If( N Row( data ) < 96,
data |/= J( 96 - N Row( data ), 1, 0 );
);
table[Column( dt, c ) << Get Name] = Transpose( Shape( data, 12, 8 ) );
);
content = table << Get Contents;
For( t = 1, t <= N Items( content ), t++,
dt = As Table( content[t][2] );
Close( dt, Save( content[t][1] || ".CSV" ) );
);
残念ながら、CSV ファイルのヘッダー名の最初の行を非表示にする方法がわかりません。 おそらく他の人が知っているかもしれません。 すぐにファイルをテキストとして読み戻し、最初の行を削除して、再度保存することができました。
Re: 行列値の置換セットアップ用のレイアウトが必要ですが、デバイスが読み取るファイルの種類は CSV ファイルのみですRe: 行列値の置換「ヘルプ」 > 「スクリプト索引」を参照してください。 ドロップダウン ボタンをクリックして、[関数] を選択します。 As Table() 関数を検索します。
Re: 行列値の置換新しい JMP ユーザーとしてのあなたの考え方は、まだスプレッドシート ユーザーのものである可能性があります。 CSV ファイルの宛先はわかりませんが、JMP では縦長のテーブル レイアウトを使用して多くのことができます。
なぜ 8x12 レイアウトが必要なのでしょうか? 行列を CSV ファイルとしてエクスポートする必要があるのはなぜですか?
この分析の目的がわかれば、JMP を有効に活用できるようお手伝いできるかもしれません。
Re: 行列値の置換ぜひご覧くださいこの郵便受け。 プレート上での実験に役立つかもしれません。
Re: 行列値の置換少し冗長かもしれませんが、csv ファイルに出力する必要がある場合にこれを処理する別の方法を次に示します。データ テーブル操作を使用してデータを正しい形式に変換し、データ テーブルを CSV ファイルに書き込みます。
Names Default To Here( 1 );
// Create some sample data
dt = New Table( "Example",
add rows( 72 ),
New Column( "c1", formula( Random Uniform( 1, 500 ) ) ),
New Column( "c2", formula( Random Uniform( 1, 500 ) ) ),
New Column( "c3", formula( Random Uniform( 1, 500 ) ) )
);
dt << run formulas;
dt:c1 << delete property( "formula" );
dt:c2 << delete property( "formula" );
dt:c3 << delete property( "formula" );
// Get the list of columns
colNamesList = dt << get column names( string, numeric );
// Loop across the columns and process them
For( i = 1, i <= N Cols( dt ), i++,
// Create a new table will only the single column
dtTemp = dt << subset(invisible, selected rows( 0 ), columns( Column( colNamesList[i] ) ) );
// If there are not 96 rows, add them
If( N Rows( dtTemp ) < 96,
rowCount = N Rows( dt );
dtTemp << add rows( 96 - rowCount );
For( k = rowCount + 1, K <= 96, k++,
Column( dtTemp, colNamesList[i] )[k] = 0
);
);
// Create a sequence column to allow for proper splitting of the data
dtTemp << New Column( "sequence",
formula(
x = Mod( Row(), 8 );
If( x == 0, x = 8 );
x;
)
);
dtTemp << run formulas;
// Split the data into 8 columns.....if this should be 12 just change the sequence formula above
dtSplit = dtTemp << Split(invisible, Split By( :sequence ), Split( Column( dtTemp, colNamesList[i] ) ), Sort by Column Property );
dtSplit << run formulas;
// Close the un needed temporary data table
Close( dtTemp, nosave );
// Change the output preferences to get rid of headers
current_pref = Char( Arg( Parse( (Char( Get Preferences( Export settings ) )) ), 1 ) );
// Set prefs (comma delimited, no headers)
Pref( Export Settings( End Of Field( Comma ), Export Table Headers( 0 ) ) );
// Save csv file
dtSplit << save( "$TEMP\" || colNamesList[i] || ".csv" );
//Restore oribinal prefs
Eval( Parse( "pref(" || current_pref || ")" ) );
// Close the un necessary table
Close( dtSplit, nosave );
);
Re: 行列値の置換ご協力とご関心をいただきありがとうございます。 Mark Bailey の連想配列手法は機能しました。 現在、連想配列をデータテーブルに配置して、CSV ファイルとしてエクスポートできるようにする方法を見つけようとしています。Re: 行列値の置換では、データをマトリックスに取り込んだら、それらを永続的な場所に移動するにはどうすればよいでしょうか?Re: 行列値の置換混乱を招いてしまい申し訳ございません。 実験の結果をプレート上の位置と関連付けて保存するために、各カラムデータを 8 x 12 (96 ウェルのマイクロタイター プレートのサイズ) の形式で保存しようとしています。 。 各列は異なる実験を表します。Re: 行列値の置換私は最初からこの議論を見てきました。本当の最終目標が何かを明らかにすることなく、スクリプト作成の練習に発展したようです。 @Mark_Baileyは連想配列を使用することで優れた解決策を提供しましたが、私が見落としているのは、これらの行列を作成する本当の理由は何でしょうか?それがわかっていれば、もっと簡単な解決策があるかもしれません。
Re: 行列値の置換列名は連想配列に格納されます。 それらが鍵なのです。 これをスクリプトに追加することで、この主張を検証できます。
Show( table << Get Keys );
[ヘルプ] > [書籍] > [スクリプト ガイド] を参照し、「連想配列」を検索することをお勧めします。 ペアを反復処理したり、他の多くのタスクを簡単に実行したりできます。 ガイド内の例は優れていますが、ご質問がある場合はここに戻ってください。
Re: 行列値の置換ありがとう!! これはうまくいきます。 ただし、列名は保存されません。 どうすればそれを修正できるか知っていますか?Re: 行列値の置換データ列はマイクロタイター プレートからの結果ですか?
各列のデータを 8x12 テーブルに再整形したいと考えています。 スクリプトはテーブルの最後の列のみを保持します。 これは、すべてのデータ列を処理し、テーブルの結果を列名とともに連想配列に保存するスクリプトです。
Names Default to Here( 1 );
dt = Open( "Example.jmp" );
table = Associative Array();
For( c = 1, c <= N Col( dt ), c++,
data = Column( dt, c ) << Get As Matrix;
data[Loc(Is Missing( data ))] = 0;
table[Column( dt, c ) << Get Name] = Transpose( Shape( data, 12, 8 ) );
);
Show( table << Get Contents );
少なくとも 96 行あると仮定します。 それ以上ある場合は失われます。 少ない場合は、0 の割り当てを 0 で埋め込む連結に変更する必要があります。 このバージョンでは代わりにパディングします。
Names Default to Here( 1 );
dt = Open( "Example.jmp" );
table = Associative Array();
For( c = 1, c <= N Col( dt ), c++,
data = Column( dt, c ) << Get As Matrix;
If( N Row( data ) < 96,
data |/= J( 96 - N Row( data ), 1, 0 );
)
table[Column( dt, c ) << Get Name] = Transpose( Shape( data, 12, 8 ) );
);
Show( table << Get Contents );
Re: 行列値の置換助けてくれてありがとう! Get As Matrix 関数を使用して、仕様を指定してデータを行列に入れることはできますか? 列のデータを 8 × 12 の行列に入れる必要があります。Re: 行列値の置換ジムさん、返信ありがとうございます!データ テーブルには現在 5 つの列がありますが、ユーザーの入力に応じて変更される可能性があります。 基本的に、データ列を12列8行の行列に入れようとしています。
(a - 1) * b + b は機能しないようです。最初の列のデータが常に data[0] になるためだと思います。 何が問題なのか知っていますか?Re: 行列値の置換Jim は非常に良い解決策を提供していますが、私もあなたが何をしたいのかよくわからないので、別の点を説明する別の方法を提案します。
Names Default to Here( 1 );
// open example
dt1 = Open( "$SAMPLE_DATA/Big Class.jmp" );
// make illustrative example with colums of different sizes (missing values)
dt2 = dt1 << Split(
Split By( :age ),
Split( :weight ),
Remaining Columns( Drop All ),
Sort by Column Property
);
Close( dt1, No Save );
// input data table as matrix
mat = dt2 << Get As Matrix;
// replace missing values with zero
mat[Loc(Is Missing(mat))] = 0;
// see result
Show( mat );
それが役に立てば幸い。
Re: 行列値の置換あなたが何をしようとしているのか本当に理解できません。ただし、以下は data という行列の値がなくなった後にゼロを埋めるスクリプトです。
dt = Open( "Example.jmp" );
Rows = N Rows( dt );
names = dt << Get Column Names( String );
Table = [];
Table = J( 8, 12, 0 );
For( i = 1, i <= N Col( dt ), i++,
data = Column( dt, names[i] ) << getValues;
For( a = 1, a <= 12, a++,
For( b = 1, b <= 8, b++,
// I believe that (a - 1 ) * b + b will be equal to the
// row number of the data matrix you read in. Once it's
// value is greater than the number of rows in the dt data
// table, it will enter zeros.
If( (a - 1) * b + b <= Rows,
Table[a, b] = data[(a - 1) * b + b],
Table[a, b] = 0
)
)
);
);
Print( Table );
外側の For() ループで列から列へと何をしているのか混乱しています。データテーブルの例には列がいくつありますか?