2 つのテーブルを掛け合わせるにはどうすればよいですかビッグデータテーブルと正規化係数テーブルがあります。
データテーブルは次のようになります。
| ID | タイプ | パラメータ1 | パラメータ2 | パラメータ3 |
| 01 | 1 | データ | データ | データ |
| 02 | 1 | データ | データ | データ |
| 03 | 2 | データ | データ | データ |
| 04 | 2 | データ | データ | データ |
正規化係数テーブルは次のようになります。
| タイプ | パラメータ1 | パラメータ2 | パラメータ3 |
| 1 | 正規化係数1 | 正規化係数2 | 正規化係数3 |
| 2 | 正規化係数4 | 正規化係数5 | 正規化係数6 |
タイプとパラメータに基づいて最初のテーブルと 2 番目のテーブルを乗算し、次のような新しいテーブルを取得するにはどうすればよいですか。
| ID | タイプ | パラメータ1 | パラメータ2 | パラメータ3 |
| 01 | 1 | データ*正規化係数1 | データ*正規化係数2 | データ*正規化係数3 |
| 02 | 1 | データ*正規化係数1 | データ*正規化係数2 | データ*正規化係数3 |
| 03 | 2 | データ*正規化係数4 | データ*正規化係数5 | データ*正規化係数6 |
| 04 | 2 | データ*正規化係数4 | データ*正規化係数5 | データ*正規化係数6 |
私の生データテーブルは行と列の両方で巨大なので、高速なソリューションが必要です。
どうもありがとうございます。
高度な統計モデリング消費者および市場調査マスカスタマイゼーション品質およびプロセスエンジニアリングRe: 2 つのテーブルを掛け合わせるにはどうすればよいですかここに例があります
mat1 = [ 1 2 3, 4 5 6, 7 8 9, 10 11 12];
mat2 = [1 2 3 4, 5 6 7 8, 9 10 11 12];
finalMat = mat1 * mat2;
データがデータテーブルにある例を次に示します。
names default to here(1);
dt1 = data table("one");
dt2 = data table("two");
finalMat=dt1[0,0]*dt2[0,0];Re: 2 つのテーブルを掛け合わせるにはどうすればよいですかこんにちは
乗算する 2 つの行列があります。たとえば、1 つ目は 3X4 行列、2 つ目は 4X2 行列です。 JMP Pro 16 でこの行列乗算を実行する方法を誰かが提案できますか?
Re: 2 つのテーブルを掛け合わせるにはどうすればよいですか更新していただきありがとうございます。試してみたところ、トライアル データセットで動作しました。 ただし、他の人が指摘したように、パフォーマンスの問題が発生します。 したがって、私は彼の答えを最良の解決策として受け入れました。
Re: 2 つのテーブルを掛け合わせるにはどうすればよいですかこんにちは、
私はこれを見て、テーブルがあなたのサイズに近づくと(実際にはそのずっと前に)パフォーマンスの壁に気づきました。テーブルを約10Kの「ブロック」で処理し始めたら、状況を少し改善することができました。行×1K列。 サイズを試して最適なものを確認することもできますが、これらの寸法がうまく機能するようです。
このメソッドは新しいテーブルを作成しません。元のテーブルを上書きします。そのため、元のテーブルを保存し、結果を別の名前で保存する必要があります。
以下のスクリプトは、全体的な概念を説明することを目的としているため、いくつかの仮定を置いています。
- 対応する列は各テーブル内で同じ順序になっています。
- p 個のパラメーターの場合、メイン テーブルには p+2 列があり、因子テーブルには p+1 列があります。どちらのテーブルにも他の列はありません。
実際の処理1000 列を含む 100 万行のテーブルの所要時間は約 40 秒でした。各「ブロック」の処理には約 0.3 ~ 0.4 秒かかりました。
あなたが持っているテーブルを模擬するためのテーブルのセットアップ部分には、しばらく時間がかかりました...おそらく数分かかりました。 現在、スクリプトはより小さなテーブル用に設定されています...これを変更するには、//table settings コメントの下の行を変更します。
このコードはエレガントでもコンパクトでもありませんが、私が思いついた他のどのコードよりも高速に実行されます (ブロック全体で一度に要素ごとの乗算を使用することも含めて)。何らかの理由で、列の反復処理にかかる時間は約半分でした。 ) ただし、私はクレイジの数式に基づいたアプローチを試しませんでした。
最初のソートは、where() を使用して行をフェッチする必要がないようにするために必要です (そうする必要がある場合、処理が大幅に遅くなります)。
乾杯、
ブレイディ
Names Default To Here( 1 );
//set limits on block size
blockRowLimit = 1e4;
blockColLimit = 1e3;
// table setup
rowsdt1 = 1e4;
colsdt1 = 1e2;
dt1 = As Table( (1 :: rowsDt1)` || J( rowsDt1, 1, Random Integer( 1, 2 ) ) || J( rowsdt1, colsdt1, Random Uniform() ), <<INVISIBLE></INVISIBLE>
Re: 2 つのテーブルを掛け合わせるにはどうすればよいですかこのループは簡単ではありません。これでできると思います:
// make example tables. **save them** so virtual join works.
factorDT = New Table( "Imported Data 2",
New Column( "Type", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2] ) ),
New Column( "parameter1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1.1, 1.2] ) ),
New Column( "parameter2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0.8, 0.9] ) ),
New Column( "parameter3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1.1, 0.9] ) )
);
factorDT << save( "$temp/factor.jmp" );
dataDT = New Table( "Imported Data",
New Column( "ID", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "Type", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 1, 2, 2] ) ),
New Column( "parameter1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "parameter2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 3, 2, 1] ) ),
New Column( "parameter3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [2, 3, 3, 2] ) )
);
dataDT << save( "$temp/data.jmp" );
originalColumns = dataDT<<GETCOLUMNNAMES></GETCOLUMNNAMES>
- 仮想結合を使用して非表示の列を追加する前に、元の列をキャプチャします。
- \!" を使用して式 e を構築し、埋め込まれた引用符をエスケープします
- 作業をデバッグするには、print ではなく write() を使用してください。
- <
Re: 2 つのテーブルを掛け合わせるにはどうすればよいですかありがとう、小さなデータセットで動作します。 しかし、テーブル 1 には何百万もの行があり、テーブル 2 には 2 行しかありません。 したがって、別の巨大なテーブルを作成することは避けたいと考えています。 より良い解決策が見つからない場合は、この方法を試してみます。
Re: 2 つのテーブルを掛け合わせるにはどうすればよいですかお返事ありがとうございます。 しかし、列が多く、列名が複雑です。 したがって、新しい列を作成するための for ループを作成したいと思います。 この声明について詳しく説明していただけますか?
Formula( :"parameter1[Type]"n * :parameter1 )
次のようなforループを書こうと考えています。
</CODE></PRE><PRE class="lia-code-sample language-markup"><CODE>colnames = dataDT << Get Column Names();
nc = ncols(dataDT);
DT = New Table("normalized", New Column("ID", values(dataDT:ID << get values)),
New Column("Type", values(dataDT:Type << get values)));
For(i = 3, i<= nc, i++,
DT << New Column( char( colnames[3]), Numeric, "Continuous", Format( "Best", 12 ), Formula( XXXX ) ));しかし、式を正しく組み立てる方法がわかりません。 エラーが発生し続けます。 手伝ってもらえますか?
ありがとう。
Re: 2 つのテーブルを掛け合わせるにはどうすればよいですかまた、数式が必要ない場合は、「より良い」場合もそうでない場合もある行列の要素ごとの乗算を検討できます。 私の MacBook では、以下のコードに約 15 秒かかりました。
NamesDefaultToHere(1);
nr = 10000; // Number of rows
nc = 10000; // Number of Columns
dt1 = AsTable(J(nr, nc, RandomInteger(1, 20)));
dt2 = AsTable(J(nr, nc, RandomUniform(0, 1)));
m1 = dt1 << getAsMatrix;
m2 = dt2 << getAsMatrix;
dtFinal = AsTable(m1 :*</img> m2);
Re: 2 つのテーブルを掛け合わせるにはどうすればよいですか仮想結合と数式列を使用できます。
Virtual join adds the blue and gold keysVirtual join adds the blue and gold keys仮想参加により青と金のキーが追加されます
これらは対話的にリンクすることも、JSL を使用してリンクすることもできます。
これは、JMP16 名を使用している可能性があります。 :"パラメータ3[タイプ]"n構文;名前が必要かもしれません( 「パラメータ3[型]」 ) その代わり。
// make example tables. **save them** so virtual join works.
factorDT = New Table( "Imported Data 2",
New Column( "Type", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2] ) ),
New Column( "parameter1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1.1, 1.2] ) ),
New Column( "parameter2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0.8, 0.9] ) ),
New Column( "parameter3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1.1, 0.9] ) )
);
factorDT << save( "$temp/factor.jmp" );
dataDT = New Table( "Imported Data",
New Column( "ID", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "Type", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 1, 2, 2] ) ),
New Column( "parameter1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4] ) ),
New Column( "parameter2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 3, 2, 1] ) ),
New Column( "parameter3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [2, 3, 3, 2] ) )
);
dataDT << save( "$temp/data.jmp" );
// join the tables
factorDT:type << Set Property( "Link ID", 1 );
dataDT:type << Set Property( "Link Reference", Reference Table( "factor.jmp" ) );
// add formula columns
dataDT << New Column( "p 1", Numeric, "Continuous", Format( "Best", 12 ), Formula( :"parameter1[Type]"n * :parameter1 ) );
dataDT << New Column( "p 2", Numeric, "Continuous", Format( "Best", 12 ), Formula( :"parameter2[Type]"n * :parameter2 ) );
dataDT << New Column( "p 3", Numeric, "Continuous", Format( "Best", 12 ), Formula( :"parameter3[Type]"n * :parameter3 ) );
// force the evaluation to complete
dataDT<<RUNFORMULAS></RUNFORMULAS>